Next Permutation of Array in DSA Java - Time & Space Complexity
We want to know how the time needed to find the next permutation changes as the array size grows.
How does the number of steps grow when the array gets bigger?
Analyze the time complexity of the following code snippet.
public void nextPermutation(int[] nums) {
int i = nums.length - 2;
while (i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
if (i >= 0) {
int j = nums.length - 1;
while (nums[j] <= nums[i]) {
j--;
}
swap(nums, i, j);
}
reverse(nums, i + 1, nums.length - 1);
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
private void reverse(int[] nums, int start, int end) {
while (start < end) {
swap(nums, start, end);
start++;
end--;
}
}
This code finds the next lexicographical permutation of the array in place.
Look at the loops and repeated steps:
- Primary operation: Scanning the array from the end to find the first decreasing element.
- How many times: Up to n times, where n is the array length.
- Then scanning again from the end to find the element to swap, up to n times.
- Finally, reversing part of the array, which can take up to n/2 swaps.
- The dominant work is these linear scans and the reverse, each at most n steps.
As the array size grows, the number of steps grows roughly in a straight line with it.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 30 steps (3 scans of up to 10 each) |
| 100 | About 300 steps |
| 1000 | About 3000 steps |
Pattern observation: The steps increase linearly as the array size increases.
Time Complexity: O(n)
This means the time to find the next permutation grows in direct proportion to the array size.
[X] Wrong: "The algorithm checks every possible permutation, so it must be factorial time."
[OK] Correct: The algorithm only scans the array a few times and reverses part of it, so it runs in linear time, not factorial.
Understanding this linear time solution shows you can handle array manipulation and think about efficient scanning, a useful skill in many coding problems.
"What if we used a sorting step instead of reversing the suffix? How would the time complexity change?"
Practice
next permutation of an array represent?Solution
Step 1: Understand permutation order
Permutations can be ordered lexicographically like words in a dictionary.Step 2: Define next permutation
The next permutation is the next arrangement that is just larger than the current one.Final Answer:
The next lexicographically greater arrangement of the array elements -> Option AQuick Check:
Next permutation = next bigger arrangement [OK]
- Thinking next permutation is sorting ascending
- Confusing next permutation with reversing array
- Assuming next permutation always moves smallest element front
arr[i] and arr[j] in an array?Solution
Step 1: Understand swapping logic
Swapping requires a temporary variable to hold one value to avoid overwriting.Step 2: Check each option
int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; uses a temp variable correctly to swap values.Final Answer:
int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; -> Option AQuick Check:
Swap needs temp variable [OK]
- Overwriting one element without temp variable
- Using incorrect order causing same values
- Trying to swap without temp variable incorrectly
int[] arr = {1, 3, 2};
nextPermutation(arr);
System.out.println(Arrays.toString(arr));
// nextPermutation method implements the standard next permutation algorithmSolution
Step 1: Identify pivot from right
From right, find first pair where arr[i] < arr[i+1]. Here, arr[0]=1 < arr[1]=3, so pivot is index 0.Step 2: Find element to swap with pivot
From right, find element > arr[0]=1, which is arr[2]=2.Step 3: Swap and reverse suffix
Swap arr[0] and arr[2]: [2,3,1]. Reverse suffix after pivot index 0: reverse [3,1] to [1,3]. Final array: [2,1,3].Final Answer:
[2, 1, 3] -> Option DQuick Check:
Next permutation of [1,3,2] = [2,1,3] [OK]
- Not reversing suffix after swap
- Swapping with wrong element
- Confusing pivot selection
void nextPermutation(int[] arr) {
int i = arr.length - 2;
while (i >= 0 && arr[i] <= arr[i + 1]) {
i--;
}
if (i >= 0) {
int j = arr.length - 1;
while (arr[j] <= arr[i]) {
j--;
}
swap(arr, i, j);
}
reverse(arr, i + 1, arr.length - 1);
}Solution
Step 1: Analyze pivot search condition
The pivot is found by moving left while arr[i] >= arr[i+1]. The code uses arr[i] <= arr[i+1], which is incorrect.Step 2: Correct condition for pivot
The condition should be arr[i] >= arr[i+1] to find the first decreasing element from right.Final Answer:
The first while condition should be arr[i] >= arr[i + 1] -> Option BQuick Check:
Pivot search needs arr[i] >= arr[i+1] [OK]
- Using wrong comparison operator in pivot search
- Forgetting to reverse suffix after swap
- Missing swap or reverse method implementations
int[] arr = {5, 4, 7, 5, 3, 2}, what will be the array after applying the next permutation algorithm twice?Solution
Step 1: Find first next permutation
Array: [5,4,7,5,3,2]
Pivot: from right, arr[1]=4 < arr[3]=5? No, arr[1]=4 < arr[2]=7 yes, pivot=1
Swap arr[1]=4 with next bigger from right: arr[3]=5 (since 5 > 4 and closest from right)
Swap: [5,5,7,4,3,2]
Reverse suffix after index 1: reverse [7,4,3,2] to [2,3,4,7]
Result: [5,5,2,3,4,7]Step 2: Find second next permutation
Array: [5,5,2,3,4,7]
Pivot: arr[4]=4 < arr[5]=7 yes, pivot=4
Swap arr[4]=4 with next bigger from right: arr[5]=7
Swap: [5,5,2,3,7,4]
Reverse suffix after index 4: reverse [4] (single element, no change)
Result: [5,5,2,3,7,4]Final Answer:
[5, 5, 2, 3, 7, 4] -> Option CQuick Check:
Two next permutations applied correctly = [5,5,2,3,7,4] [OK]
- Incorrect pivot selection
- Not reversing suffix after swap
- Swapping with wrong element
Ready to prove it?
Pass the test and this pattern moves unknown
