从右往左找第一个num[i-1]<num[i]的i。
此时从i到最右边是从大到小排列的,从右往左找第一个num[j]>num[i-1],交换i-1和j对应的数。
此时从i到最右边仍是从大大小排列,倒序,变成从小到大。
#include<algorithm>
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int i=nums.size()-1;
while(i>=1 && nums[i-1]>=nums[i]) --i;
if(i>0){
int j=nums.size()-1;
while(nums[j]<=nums[i-1]) --j;
swap(nums[i-1],nums[j]);
}
reverse(nums.begin()+i,nums.end());
}
};
c++福利
#include<algorithm>
class Solution {
public:
void nextPermutation(vector<int>& nums) {
next_permutation(nums.begin(),nums.end());
}
};