【LeetCode 31】下一个排列

题目链接

【题解】


从右往左找第一个下降的位置i(即满足nums[i]<nums[i+1]);
然后在[i+1..len-1]这个区间里面找到一个最大的下标k,使得nums[k]>numsi
注意一个性质(i+1..len-1)这一段是单调递减的了
然后swap(nums[k],nums[i]);
然后再把[i+1..len-1]这一段序列翻转一下。
就能得到next_permutation了

【代码】

class Solution {
public:
    void swap(int &a,int &b){
        int t = a;a = b;b = t;
    }

    void _reverse(vector<int>&nums,int l,int r){
        while(l<=r){
            swap(nums[l],nums[r]);
            l++;r--;
        }
    }

    void nextPermutation(vector<int>& nums) {
        int len = nums.size();
        int j = -1;
        for (int i = len-1;i >= 0;i--){
            if (i-1>=0 && nums[i]>nums[i-1]){
                j = i-1;
                break;
            }
        }
        if (j==-1){
            _reverse(nums,0,len-1);   
        }else{
            for (int i = len-1;i >= 0;i--){
                if (nums[i]>nums[j]){
                    swap(nums[i],nums[j]);
                    break;
                }
            }
            _reverse(nums,j+1,len-1);
        }
    }
};

猜你喜欢

转载自www.cnblogs.com/AWCXV/p/11839690.html