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.
How does the number of steps grow when the array gets bigger?
Analyze the time complexity of the following code snippet.
void nextPermutation(std::vector<int>& nums) {
int i = nums.size() - 2;
while (i >= 0 && nums[i] >= nums[i + 1]) i--;
if (i >= 0) {
int j = nums.size() - 1;
while (nums[j] <= nums[i]) j--;
std::swap(nums[i], nums[j]);
}
std::reverse(nums.begin() + i + 1, nums.end());
}
This code finds the next lexicographical permutation of the array in place.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Two while loops scanning parts of the array and one reverse operation.
- How many times: Each loop runs at most once from the end towards the start, scanning up to n elements.
As the array size grows, the loops may scan more elements, but each element is visited only a few times.
| 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 operations grow roughly in direct proportion to the input size.
Time Complexity: O(n)
This means the time to find the next permutation grows linearly with the size of the array.
[X] Wrong: "The algorithm checks all permutations, so it must be factorial time."
[OK] Correct: The algorithm only finds the very next permutation by scanning the array a few times, not generating all permutations.
Understanding this linear time approach shows you can handle array scanning and in-place changes efficiently, a useful skill in many coding problems.
"What if we used a sorting step instead of reverse at the end? How would the time complexity change?"
Practice
next_permutation function do to an array of integers?Solution
Step 1: Understand the purpose of next_permutation
The function changes the array to the next bigger arrangement in dictionary order.Step 2: Compare with other options
Sorting or reversing are different operations; next_permutation specifically finds the next lexicographic order.Final Answer:
It rearranges the array to the next lexicographically greater permutation. -> Option AQuick Check:
Next permutation = next lexicographic order [OK]
- Confusing next_permutation with sorting
- Thinking it reverses the array
- Assuming it finds max element
std::next_permutation on a vector v in C++?Solution
Step 1: Recall the correct function signature
std::next_permutation requires two iterators: begin and end of the container.Step 2: Check each option
std::next_permutation(v.begin(), v.end()); uses correct syntax with std:: and iterators. std::next_permutation(v); misses iterators. next_permutation(v.begin(), v.end()); misses std::. std::next_permutation(v.start(), v.finish()); uses invalid iterator names.Final Answer:
std::next_permutation(v.begin(), v.end()); -> Option AQuick Check:
Use std::next_permutation with begin() and end() [OK]
- Omitting std:: namespace
- Passing container instead of iterators
- Using wrong iterator names like start() or finish()
std::next_permutation once on arr = {1, 3, 2}?Solution
Step 1: Trace the next_permutation algorithm
Array [1, 3, 2]. Find rightmost pivot i where arr[i] < arr[i+1]: i=0 (1 < 3).Step 2: Find rightmost j > i with arr[j] > arr[i]
j=2 (2 > 1). Swap i=0 and j=2: [2, 3, 1]. Reverse suffix from 1: [3, 1] -> [1, 3]. Result: [2, 1, 3].Final Answer:
[2, 1, 3] -> Option DQuick Check:
Next permutation of [1,3,2] = [2,1,3] [OK]
- Confusing next with previous permutation
- Not reversing suffix after swap
- Assuming array stays same if not sorted
std::vector<int> v = {3, 2, 1};
std::next_permutation(v.begin(), v.end());
for(int x : v) std::cout << x << ' ';
What is the output and why?Solution
Step 1: Recognize input is highest permutation
The array [3, 2, 1] is sorted descending, so it's the last permutation.Step 2: next_permutation resets to lowest permutation
Since no next bigger permutation exists, it resets to ascending order [1, 2, 3].Final Answer:
1 2 3 -> Option BQuick Check:
Last permutation resets to first [OK]
- Expecting no change on last permutation
- Thinking next_permutation always swaps elements
- Ignoring reset behavior
arr = {1, 5, 4, 3, 2}, what is the next permutation after applying std::next_permutation?Solution
Step 1: Find the pivot from right where arr[i] < arr[i+1]
arr=[1,5,4,3,2]. Check from right: i=3 (3<2? No), i=2 (4<3? No), i=1 (5<4? No), i=0 (1<5 Yes). Pivot=0.Step 2: Find rightmost element > pivot (1) to swap
Rightmost j>0 with arr[j]>1: j=4 (2>1). Swap 0 and 4: [2,5,4,3,1].Step 3: Swap and reverse suffix
Reverse suffix after 0: [5,4,3,1] -> [1,3,4,5]. Final: [2,1,3,4,5].Final Answer:
[2, 1, 3, 4, 5] -> Option CQuick Check:
Swap pivot and rightmost successor, then reverse suffix [OK]
- Swapping wrong elements
- Not reversing suffix after swap
- Confusing pivot index
Ready to prove it?
Pass the test and this pattern moves unknown
