【理解题意】next permutation 下一个字典序更大的排列

求下一个字典序更大的排列。

大致思路:

需要理解题意。

其实对于数字的序列来说,只关注2个数,其实要么是升序,要么是降序,要么是相等。这里不用考虑相等了,因为相等的话字典序也一样,那么就看如果原来是降序,比如1 3 2 1中后三个是降序,下一个字典序更大的排列是2 1 1 3,应该怎么求出来呢?可以发现,先把后三个降序的排成升序,但显然1 1 2 3的字典序是小于原来的1 3 2 1的,所以需要再从后三个数里找到第一个大于1的数2,将它与1交换,则相等于以2打头开始重新排,当然比1 3 2 1这种以1打头的字典序大啦。

那如果全都是降序的呢?按照题意,特殊情况,直接输出全部的升序。

那如果后面是升序没有降序呢?那更简单,跳过前面对降序排成升序的步骤,然后做法相同。

具体看程序,很清楚了。编程注意:对数组num进行sort直接sort(num,num+len),但对vector的话vector名不能直接代表首地址,必须要取.begin()和.end()或.begin()+len。

AC代码:

class Solution {
public:
    void nextPermutation(vector<int> &num) {
        int len= num.size();
        if(len==0)
            return;
        if(len==1)
            return;
        //先找降序
        int i=len-1;
        while(i>0 && num[i]<=num[i-1])
            i--;
        if(i==0) //说明全是降序的,这是特殊情况,直接输出所有的升序序列就好了
        {
            sort(num.begin(),num.end());
            return;
        }
        //否则,把降序的部分变成升序,并且将其中第一个大于num[i-1]的数和num[i-1]换
        sort(num.begin()+i,num.end());
        for(int j=i;j<len;j++)
        {
            if(num[j]>num[i-1])
            {
                swap(num[j],num[i-1]);
                break;
            }
        }
        return;
    }
};

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值