Leetcode31 Next Permutation

题意:给你一串数字(当然也可以理解成整体是一个数),求这些数字字典序排列中的下一种排列

分析:从左到右,先不断寻找左边数字比右边数字大的位置(只有这样才能通过把右边数与左边换使数字整体变大的效果),然后不断向右扫描找这种情况的最小可能(因为是字典序次大嘛。。),然后从尽可能右侧找个数字把固定那个位置的数字换掉(此时该位置以右肯定是从大到小排列的,所以为了换的数字尽量小。。),最后一个reverse,让后面那些数最小就行(注意即使换过了之后右侧那些数依旧是从大到小排列的)

AC:

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int n=nums.size();
        int bt=-1;
        int bl=0;
        for(int i=0;i<n-1;i++)
        {
            if(nums[i]<nums[i+1])
                bt=i;
        }
        if(bt>=0)
        {
            for(int i=n-1;i>=bt;i--)
            {
                if(nums[i]>nums[bt])
                {
                    bl=i;
                    break;
                }
            }   
            swap(nums[bt],nums[bl]);
            reverse(nums.begin()+bt+1,nums.end());
        }
        else
        reverse(nums.begin(),nums.end());
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值