题目
倒叙找到第一个>前一个的数,将前一个数 与这个数下标到n-1中最小的>前一个数的数 交换,将这个数到n=1 reverse即可。
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int n=nums.size();
int flag=0;
for(int i=n-1;i>=1;--i){
if(nums[i]>nums[i-1]){
reverse(nums.begin()+i,nums.end());//[i,n-1]由大到小变为由下到大
int dex=upper_bound(nums.begin()+i,nums.end(),nums[i-1])-nums.begin();
swap(nums[i-1],nums[dex]);//i-1应该与[i,n-1]里面最小的>nums[i-1]的值交换
flag=1;break;
}
}
if(!flag) reverse(nums.begin(),nums.end());
}
};