uacs2024

导航

leetcode 31. 下一个排列 中等

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);
    }
};

 

posted on 2024-11-19 13:16  ᶜʸᵃⁿ  阅读(1)  评论(0编辑  收藏  举报