力扣hot100:31. 下一个排列

LeetCode:31. 下一个排列

在这里插入图片描述

字典序的大小排序:

  • 从前往后对比,如果先出现更小字符的,字典序更小,如果有个字符串结束了,则它更小。
  • string s = "112233"和string t = "1122334",s更小

根据字典序排序说法,我们想找到尽可能小的比当前字典序大的字符串,我们就要尽可能的使得字典序大的出现在更右边。

我们考虑极端情况,如"1122334",比它更大一点的将是"1122343",我们会发现,我们只需要将右边较大的一个数与前面较小的一个数交换就能变得更大,不过为了更小我们需要将交换后的后面部分从小到大排序。

  • "14321",从右往前看,最右边的1走到4都是升序,也就是这一段不可能可以交换变得更大,同理,只要从右边开始看,一直是升序的段,就不可能可以交换变得更大,而如果出现非升序,也就是最左边的1,那就必然可以交换了,因为一定有右边存在一个数比这个数大!
  • 当然我们想要最小的更大的数跟最左边的1交换,我们就需要找到2

算法思路:
124 2 98765432

  1. 从右往左,找到一个断层的第一个数(如果没有,那么整个降序就是答案,再给出的例子里是空出来的2
  2. 在这个断层的数右边找一个比它大但在右边最小的数,与其交换。(交换后右边的数还是顺序排列的,这个更大数是右边的3,交换后变为124398765422
  3. 反转右边的数(注意右边的数一定是按顺序排列的,因为我们按1.的方式进行查找的,反转后变为124322456789,这保证了更大,但是是更大中的最小的那一个。)

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)
在这里插入图片描述

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

相关推荐

  1. 滑动模块--一个排列

    2024-06-18 20:40:04       22 阅读
  2. 496. 一个更大元素 I

    2024-06-18 20:40:04       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-18 20:40:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-18 20:40:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-18 20:40:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-18 20:40:04       18 阅读

热门阅读

  1. 建立fabric-ca-serve集群

    2024-06-18 20:40:04       7 阅读
  2. fastapi对视频播放加速方法

    2024-06-18 20:40:04       4 阅读
  3. 嵌入式就业前景好么

    2024-06-18 20:40:04       5 阅读
  4. 数据库回表及优化方法(附示例)

    2024-06-18 20:40:04       6 阅读
  5. 计算机网络模型面试题50题

    2024-06-18 20:40:04       7 阅读
  6. 图解ZGC

    图解ZGC

    2024-06-18 20:40:04      4 阅读
  7. [python日常]获取指定文件夹下,指定后缀的文件

    2024-06-18 20:40:04       8 阅读
  8. PostgreSQL源码分析——SeqScan

    2024-06-18 20:40:04       7 阅读
  9. css伪类和伪元素选择器

    2024-06-18 20:40:04       5 阅读
  10. 充电学习—2、开关电源基本原理

    2024-06-18 20:40:04       5 阅读