栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

下一个排列

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

下一个排列

这道题类似于,脑筋急转弯的问题,只需要记住怎么做就ok了

我们要找出下一个排列中字典序比上一个大的排列,且要最小

这时我们可以想一下

我们可以保持一个序列的高位不动,只用改变低位便可以了,这样才能使下一个排列的变化最小

因此我们可以从后往前考虑,

如果我们假定到了某一位,前面的位数都保持不变,而后面的位数都小于等于这一位,是不是说明这个序列的字典序就使最大的,比如说1321,我们假设千位上的数不变,而百位后面的数都小于等于百位,是不是可以说明这个在千位保持不变的字典序最大,所以我们需要找到在下降序列前一个数,将它与下降序列中离他最近且比它大的数进行交换,这样才能得出下一个更大的排列,我们再把下降的序列改为升序

总体来说可以分为几个步骤:

1.从后往前遍历找出降序序列

2.找出比降序序列前一个数更大的数

3.交换两个数的值

3.将降序序列倒序,即为变为升序

步骤:

1.定义指针k从后往前遍历,找出降序序列,最后while循环结束时,k就表示,降序排列中最大的数,k-1表示降序排列中的前一个数,while循环的时候注意边界

2.如果所有数都是降序排列的,说明这种排列的字典序最大,直接按题意反转一下就ok了

3.使t=k,入伙nums[t]>nums[k-1],t++,最后nums[t]<=nums[k-1],所以最后交换的使nums[t-1]于nums[k]的值

4.最后反转一下降序序列,这里使nums.begin()+k,从降序序列开始反转。

注意:一定要注越没越界,一定要注意越界

一定要注意,一定要注意,一般再比较前后两个数大小的时候,一定要注意越界这回事

class Solution {
public:
    void nextPermutation(vector& nums) {
          int k=nums.size()-1;
          while(k&&nums[k-1]>=nums[k])k--;
          if(k<=0)reverse(nums.begin(),nums.end());
         else{ int t=k;
          while(tnums[k-1])t++;
             swap(nums[t-1],nums[k-1]);
           reverse(nums.begin()+k,nums.end());
       }
    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/717557.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号