Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place and use only constant extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
方法1:
思路:
从后往前找到第一个i s.t. nums[i] < nums[i + 1]。因为在严格降序的部分,不存在更大的排列数。找到的这个数字之后,需要找到后面的降序序列中最小的大于nums[i]的数字,swap这两个数,然后再进行一次后面剩余数字的sorting来确保最小permutation。
易错点
class Solution {
public:
void nextPermutation(vector<int>& nums) {
if (nums.size() < 2) return;
int i;
for (i = nums.size() - 1; i > 0; i--){
if (nums[i] > nums[i - 1]) break;
}
if (i == 0) {
sort(nums.begin(), nums.end());
return;
}
i--;
int j;
for (j = nums.size() - 1; j > i; j --){
if (nums[j] >nums[i]) break;
}
swap(nums[i] , nums[j]);
sort(nums.begin() + i + 1, nums.end());
return;
}
};