LeetCode刷题 31.下一个排列

31. 下一个排列

在这里插入图片描述

  • 解析:
    • 分析, 找到下一个字典序最大排列,那么我们应该从低数位开始修改,例如对于,长度为6的排列,若我们能让它的最低两位排列变大一些,这个排列整体也变大了,修改更高位的排列只能比修改最低两位的排列要大。
    • 找到需要修改的最低位排列,如果一个低位排列是单调非增的,那么无法将它变得更大,因此从尾部开始扫描,找到的第一个不是单调非增的低位排列就是我们需要修改的数 a [ i ] a[i] a[i]
    • 在修改时,我们应该利用在上一次找到的单调非增排列 a [ i + 1 : ] a[i+1:] a[i+1:]中选择恰好大于 a [ i ] a[i] a[i]的数去交换 a [ i ] a[i] a[i],交换后 a [ i + 1 : ] a[i+1:] a[i+1:]应当变为最小排列,注意此时 a [ i + 1 : ] a[i+1:] a[i+1:]依然是一个单调非增排列,不用排序直接首尾交换即可得到单调非减排列,此时便完成了下一个排列。
  • code(需要剔除一些例外情况):
class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int previous_max = -1;
        int n = nums.size();
        if(n<=1)
            return;
        int i=n-1;
        for(;i>=0;i--){
            if(nums[i]<previous_max)
                break;
            previous_max = nums[i];
        }
        if(i<0){
            int left =0, right = n-1;
            while(right>left){
                int tmp  = nums[right];
                nums[right--] = nums[left];
                nums[left++] = tmp;
            }
            return;
        }
        int j = i+1;
        for(j=i+1;j<n;j++){
            if(nums[j]<=nums[i])
                break;
        }
        int tmp = nums[i];
        nums[i] = nums[j-1];
        nums[j-1] = tmp;

        int left =i+1, right = n-1;
        while(right>left){
            int tmp  = nums[right];
            nums[right--] = nums[left];
            nums[left++] = tmp;
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值