Leetcode31. 下一个排列

基本思路:

  1. 从数组最后开始向前找出,使得前一个数小于本身的第一个数,下标记为r;(若r=0即不存在下一个更大的排列,则将数字重新排列成最小的排列。)
  2. 然后从r开始向后下标r以后大于小标r-1的最小的数,下标记为k;
  3. 交换下标为r-1和k,的两个数,
  4. 将包括下标r的数组后面的 数反转(即从小到大排列)。
class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int len=nums.size();
        int r=len-1;
        while(r!=0&&nums[r-1]>=nums[r])r--;
        if(r)
        {
            int k=r;
            while(k<len-1&&nums[k+1]>nums[r-1])++k;
            swap(nums[r-1],nums[k]);
        }
        reverse(nums.begin()+r,nums.end());
        
        
    }
};

猜你喜欢

转载自blog.csdn.net/qq_43387999/article/details/86520578