【题解】
从右往左找第一个下降的位置i(即满足nums[i]最大的下标k,使得nums[k]>nums[i](也即最右边的大于nums[i]的位置)
注意一个性质(i+1..len-1)这一段是单调递减的了
然后swap(nums[k],nums[i]);
然后再把[i+1..len-1]这一段序列翻转一下。
就能得到next_permutation了
【代码】
class Solution {
public:
void swap(int &a,int &b){
int t = a;a = b;b = t;
}
void _reverse(vector<int>&nums,int l,int r){
while(l<=r){
swap(nums[l],nums[r]);
l++;r--;
}
}
void nextPermutation(vector<int>& nums) {
int len = nums.size();
int j = -1;
for (int i = len-1;i >= 0;i--){
if (i-1>=0 && nums[i]>nums[i-1]){
j = i-1;
break;
}
}
if (j==-1){
_reverse(nums,0,len-1);
}else{
for (int i = len-1;i >= 0;i--){
if (nums[i]>nums[j]){
swap(nums[i],nums[j]);
break;
}
}
_reverse(nums,j+1,len-1);
}
}
};