leetcode 31. 下一个排列 中等
看了题解的思路,用自己看得懂的方式写的代码
class Solution {
public:
void reverse(int left,int right,vector<int>& nums){
for(int i = left,j = right;i < j;i++,j--)
swap(nums[i],nums[j]);
}
void nextPermutation(vector<int>& nums) {
int size = nums.size();
if(size == 1) return;
if(size == 2){
swap(nums[0],nums[1]);return;
}
int pSmaller = -1;//找到第一个非倒序的数的坐标
for(int i = size-2; i >= 0; i--){
if(nums[i] < nums[i+1]){
pSmaller = i;break;
}
}
//如果第一个非倒序的数的坐标还是-1,那么整个序列就是递减的
if(pSmaller == -1){
reverse(0,size-1,nums);return;
}
int pBigger;//找到比第一个非倒序的数更大一点的数的坐标
//因为能找到pSmall,就保证了从pSmall到序列结尾都是递减的
for(int j = size-1; j >= pSmaller + 1; j--){
if(nums[pSmaller] < nums[j]){
pBigger = j;break;
}
}
swap(nums[pSmaller],nums[pBigger]);
reverse(pSmaller+1, size-1, nums);
}
};