31. Next Permutation

Question

LeetCode Problem

A permutation of an array of integers is an arrangement of its members into a sequence or linear order.

Input: nums = [1,2,3] Output: [1,3,2]

Example 2:

Input: nums = [3,2,1] Output: [1,2,3]

Example 3:

Input: nums = [1,1,5] Output: [1,5,1]

Constraints:


Solutions

see 3 Types of Permutation Generation
hint: lexicographical comparison :
if a[i] > b[i] then a is smaller than b
if a[i] < b[i] then a is greater than b

step 1 : scan from right to left to find the right most index i where nums[i] < nums[i+1]
e.g. [1 4 3 2] , i is at 1
step 2 : find the element to swap with pivot. From the right end, find the right most index j such that nums[j] > nums[i]. Then swap nums[i] and nums[j]
step 3 : reverse the subarray from i + 1 to the end

void nextPermutation(vector<int>& nums) {
	int n = static_cast<int>(nums.size());
	int i = n - 2;
	// step 1
	while (i >= 0 && nums[i] >= nums[i+1]) {
		i--;
	}
	
	if (i < 0) {
		// already the last permutation, just reverse it.
		reverse(nums.begin(), nums.end());
		return;
	}
	
	// step 2
	int j = n - 1;
	while (nums[i] >= nums[j]) {
		j--;
	}
	// step 3 : swap
	swap(nums[i], nums[j]);
		
	// step 4: reverse [i + 1, end)
	reverse(nums.begin() + i + 1, nums.end());
}