思路:
从右到左找出满足nums[m]<nums[m+1],如果不存在翻转整个数组;
在m索引后,找出nums[n]>nums[m];
交换nums[m]和nums[n]的位置,将m索引后数组从小到大排列;
class Solution {
private:
//交换数组元素
void swap(vector<int>& nums,int i,int j){
int tmp=nums[i];
nums[i]=nums[j];
nums[j]=tmp;
}
//翻转数组
void reverse(vector<int>& nums,int i){
int start=i;
int end=nums.size()-1;
while(start<end){
swap(nums,start,end);
start++;
end--;
}
}
public:
void nextPermutation(vector<int>& nums) {
//寻找逆序的两个数
int i=nums.size()-2;
while(i>=0 && nums[i+1]<=nums[i])
i--;
if(i>=0){ //若存在,先交换元素
int j=nums.size()-1;
while(j>=0 && nums[j]<=nums[i])
j--;
swap(nums,i,j);
}
reverse(nums,i+1); //翻转整个数组
}
};