当前位置: 首页 > news >正文

31.下一个排列

        下一个排列是说,给你一个数组,求出按照字典序排列的下一个序列,什么意思呢?

例如,1 ,2,3。下一个排列是1,3,2。如果不清楚,我们继续看下一个例子

        1,3,5,4,2 他的下一个排列是1,4,2,3,5,怎么出来的呢?

既然要我们找按字典序排列更大的,那么下一个排列就比当前序列大一点点就好,如果我们有以下几个方案

        1,修改4 ,2,那么 1,3,5,2,4,比当前还要小,这不行

        2,修改5,4,2,因为5,4,2是降序的,修改哪一个位置,都会比当前小, 

        3,修改3,5,4,2,我们将3,改为 4,   1 4 _

下一个排列是指在字典序中,找到一个比当前序列稍大的新序列。以数列 1, 2, 3 为例,它的下一个排列是 1, 3, 2。

再比如数列 1, 3, 5, 4, 2,它的下一个排列是 1, 4, 2, 3, 5。这个结果是怎样得出的呢?

我们遵循"下一个排列仅比当前序列大一点点"的原则,尝试以下方案:

  1. 如果修改 4 和 2,得到 1, 3, 5, 2, 4,这比原序列更小,不符合要求
  2. 修改 5, 4, 2 也不行,因为这部分是降序排列,任何修改都会使序列更小
  3. 修改 3, 5, 4, 2,将 3 替换为 4,得到 1, 4, _, _, _。此时我们找到了一个比原序列大的新序列,接下来只需将剩余部分按升序排列即可。

整个过程可以总结为以下步骤:

  1. 从右向左扫描,找到第一个数字 x,满足其右侧存在比它更大的数字。这样可以使 x 变大。在 1, 3, 5, 4, 2 中,x=3。值得注意的是,x 右侧的序列必定是降序排列。如果右侧不是降序,就意味着存在比 x 更早满足条件的数字。

  2. 在 x 的右侧找到第一个比 x 大的数字,交换这两个数字的位置。在本例中,就是交换 3 和 4。

  3. 为保持"下一个排列仅比当前序列大一点点"的原则,将交换后 x 右侧的序列反转,使其成为升序排列(因为原先是降序,反转后即为最小字典序)。这样就得到了下一个排列。

_ _,找到了比当前大的序列,那么本着下一个排列就比当前序列大一点点就好的原则,后面的序列我们按照顺序排列即可。

        代码:

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

        时间复杂度:O(n),最坏情况下,序列是降序的,需要全部遍历

        空间复杂度:O(1),仅使用了额外变量

http://www.xdnf.cn/news/376435.html

相关文章:

  • 慈缘基金会“蝴蝶飞”助西藏女孩白玛卓嘎“折翼重生”
  • FreeRTOS Semaphore信号量-笔记
  • 项目管理从专家到小白
  • Pale Moon:速度优化的Firefox定制浏览器
  • 棒球裁判员学习指南·棒球1号位
  • 【数据结构与算法】图的基本概念与遍历
  • 嵌入式硬件篇---麦克纳姆轮(简单运动实现)
  • Linux系统入门第十二章 --Shell编程之正则表达式
  • [架构之美]Windows系统安装MySQL 8.0详细图文教程(十八)
  • 论文精读:YOLOE: Real-Time Seeing Anything
  • 从0开始学习大模型--Day05--理解prompt工程
  • 零知识证明:区块链隐私保护的变革力量
  • HTTPS加密握手与加密算法
  • Kotlin 内联函数深度解析:从源码到实践优化
  • 分书问题的递归枚举算法
  • [思维模式-25]:《本质思考力》-6- 马哲的三大规律:对立统一规律、质量互变规律、否定之否定规律,以及在计算机领域中的体现
  • RHCE实验:远程控制qq邮箱发送邮件
  • 20250510解决NanoPi NEO core开发板在Ubuntu core22.04.3系统下适配移远的4G模块EC200A-CN的问题
  • C++内存管理
  • 仓库管理系统,Java+Vue,含源码及文档,高效管理仓库物资,实现入库、存储、出库全流程数字化精准管控
  • 基于CNN卷积神经网络的带频偏QPSK调制信号检测识别算法matlab仿真
  • MySQL 从入门到精通(五):索引深度解析 —— 性能优化的核心武器
  • idea如何快速生成测试类
  • 【赵渝强老师】TiDB SQL层的工作机制
  • Yocto中`${B}`变量的作用
  • 论文图表自动编号与交叉引用
  • python中的继承和多态
  • FreeRTOS Queue消息队列-笔记
  • AlimaLinux设置静态IP
  • 护网HVV初级蓝队面试题总结