思路
找到下一个排列,比较好的思路是 O(n) 从尾向前遍历,找到第一个 nums[i−1]<nums[i] 的位置,这说明从i to n-1 都是由大到小排好序的。保存下标i-1。
然后再从尾开始找,找到第一个值大于下标i-1的点,交换两个值。
最后对i到n-1排序
代码
void nextPermutation(vector<int>& nums) {
int N = nums.size();
bool flag = false;
int i,j;
for (i=N-1;i>=1;--i){
if (nums[i-1]<nums[i]){
for (int j=N-1;j>=i;--j){
if (nums[j]>nums[i-1]){
swap(nums[j],nums[i-1]);
flag=true;
break;
}
}
}
if (flag) break;
}
sort(nums.begin()+i,nums.end());
}