Next Permutation of Array in DSA C - Time & Space Complexity
We want to understand how the time needed to find the next permutation changes as the array size grows.
Specifically, how does the work increase when the array gets longer?
Analyze the time complexity of the following code snippet.
void nextPermutation(int* nums, int numsSize) {
int i = numsSize - 2;
while (i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
if (i >= 0) {
int j = numsSize - 1;
while (nums[j] <= nums[i]) {
j--;
}
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
int left = i + 1, right = numsSize - 1;
while (left < right) {
int temp = nums[left];
nums[left++] = nums[right];
nums[right--] = temp;
}
}
This code finds the next lexicographically greater permutation of the array or rearranges it to the smallest if none exists.
Look for loops and repeated steps.
- Primary operation: Three while loops that scan parts of the array.
- How many times: Each loop can run up to n times, where n is the array length.
As the array size grows, the loops may scan more elements.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | Up to about 30 steps |
| 100 | Up to about 300 steps |
| 1000 | Up to about 3000 steps |
Pattern observation: The total steps grow roughly in a straight line with the array size.
Time Complexity: O(n)
This means the time to find the next permutation grows linearly with the array length.
[X] Wrong: "The algorithm always checks every pair of elements, so it must be O(n²)."
[OK] Correct: Each loop scans only once and does not nest inside others, so total work is proportional to n, not n squared.
Understanding this linear time solution shows you can handle array scanning and swapping efficiently, a skill useful in many coding problems.
"What if the array was sorted in descending order? How would the time complexity behave then?"
Practice
next permutation of an array represent?Solution
Step 1: Understand the concept of permutation order
Permutations can be ordered lexicographically like words in a dictionary.Step 2: Define next permutation
The next permutation is the immediate next arrangement that is greater than the current one in lexicographic order.Final Answer:
The next lexicographically greater arrangement of the array elements -> Option AQuick Check:
Next permutation = next bigger arrangement [OK]
- Confusing next permutation with sorting ascending
- Thinking next permutation is just reversing array
- Assuming next permutation always moves smallest element front
a and b using a temporary variable?Solution
Step 1: Understand swapping with a temporary variable
Use a temporary variable to hold one value while assigning the other.Step 2: Check each option
int temp = a; a = b; b = temp; correctly uses a temp variable to swap values safely.Final Answer:
int temp = a; a = b; b = temp; -> Option DQuick Check:
Swap with temp variable = int temp = a; a = b; b = temp; [OK]
- Assigning a = b; b = a; loses original value
- Using arithmetic swap without considering overflow
- Not declaring or initializing temp variable
arr = {1, 3, 2}?
void nextPermutation(int* arr, int n) {
int i = n - 2;
while (i >= 0 && arr[i] >= arr[i + 1]) i--;
if (i >= 0) {
int j = n - 1;
while (arr[j] <= arr[i]) j--;
int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;
}
int left = i + 1, right = n - 1;
while (left < right) {
int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp;
left++; right--;
}
}
int main() {
int arr[] = {1, 3, 2};
nextPermutation(arr, 3);
for (int i = 0; i < 3; i++) printf("%d ", arr[i]);
return 0;
}Solution
Step 1: Find the pivot index i
Start from right: arr[1]=3, arr[2]=2, since 3 >= 2, i moves left to 0 where arr[0]=1 < arr[1]=3, so i=0.Step 2: Find j to swap with i
From right, find j where arr[j] > arr[i]: arr[2]=2 > 1, so j=2. Swap arr[0] and arr[2]: arr becomes {2, 3, 1}.Step 3: Reverse suffix after i
Reverse elements from i+1=1 to end: reverse {3,1} to {1,3}. Final array: {2,1,3}.Final Answer:
2 1 3 -> Option CQuick Check:
Next permutation of [1,3,2] = [2,1,3] [OK]
- Not reversing suffix after swap
- Swapping with wrong element j
- Stopping pivot search too early
arr of size n:
void nextPermutation(int* arr, int n) {
int i = n - 1;
while (i > 0 && arr[i] <= arr[i - 1]) i--;
if (i > 0) {
int j = n - 1;
while (arr[j] <= arr[i - 1]) j--;
int temp = arr[i - 1]; arr[i - 1] = arr[j]; arr[j] = temp;
}
int left = i, right = n - 1;
while (left < right) {
int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp;
left++; right--;
}
}Solution
Step 1: Analyze the pivot search loop
The pivot is found by moving left from n-2, but here i starts at n-1, which skips checking the last pair correctly.Step 2: Correct initial i value
Setting i = n - 2 ensures the loop compares arr[i] and arr[i+1] properly to find the pivot.Final Answer:
The initial value of i should be n - 2, not n - 1 -> Option BQuick Check:
Pivot search starts at n-2 index [OK]
- Starting pivot index at n-1 causes missed comparisons
- Incorrect comparison operators in loops
- Reversing wrong subarray segment
arr = {5, 4, 7, 5, 3, 2}, what will be the next permutation after applying the standard next permutation algorithm?Solution
Step 1: Find pivot index i
Traverse from right: arr[4]=3, arr[5]=2 (3 >= 2), move left; arr[3]=5, arr[4]=3 (5 >= 3), move left; arr[2]=7, arr[3]=5 (7 >= 5), move left; arr[1]=4, arr[2]=7 (4 < 7), so i=1.Step 2: Find j to swap with i
From right, find j where arr[j] > arr[i]: arr[5]=2 (2 > 4? No), arr[4]=3 (3 > 4? No), arr[3]=5 (5 > 4? Yes), so j=3. Swap arr[1] and arr[3]: arr becomes {5,5,7,4,3,2}.Step 3: Reverse suffix after i
Reverse elements from i+1=2 to end: reverse {7,4,3,2} to {2,3,4,7}. Final array: {5,5,2,3,4,7}.Final Answer:
[5, 5, 2, 3, 4, 7] -> Option AQuick Check:
Next permutation of [5,4,7,5,3,2] = [5,5,2,3,4,7] [OK]
- Not finding correct pivot index
- Swapping with wrong element j
- Not reversing suffix correctly
Ready to prove it?
Pass the test and this pattern moves unknown
