力扣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;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/854994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无代码爬虫八爪鱼采集器-如何采集携程网指定酒店差评信息

场景描述&#xff1a;有一些酒店会分析同行的差评原因&#xff0c;以便提前做预案&#xff0c;避免自己酒店也放同样的错误。他们通过采集携程网指定酒店的提取中差评&#xff0c;使用的采集工具为无代码爬虫软件八爪鱼采集器免费版&#xff0c;下载链接&#xff1a;1.软件分享…

【PyQt5】一文向您详细介绍 self.sender() 的作用

【PyQt5】一文向您详细介绍 self.sender() 的作用 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&a…

暑期计划打卡清单表怎么写 暑期待办计划清单

暑假来临&#xff0c;是不是感觉时间好像突然多了起来&#xff0c;但又不知道该做些什么好&#xff1f;别担心&#xff0c;列一个暑期计划打卡清单表&#xff0c;就能让你的暑假生活变得有条不紊、充实而有意义。 计划清单&#xff0c;就像是给暑假生活绘制的一张地图。没有它…

Jasper Studio制作报表,预览时候出现死循环,一直渲染页面,total pages无限渲染

目录 1.1、错误描述 1.2、解决方案 1.1、错误描述 最近遇到一个jasper报表线上预览出现死循环的问题&#xff0c;实施人员反馈&#xff0c;线上生产环境中&#xff0c;使用某个功能显示pdf的时候&#xff0c;出现了接口超时问题&#xff0c;在这个项目中&#xff0c;我们使用…

精准测试:代码覆盖率与测试覆盖率

在日常的测试过程当中&#xff0c;不管是人工进行接口测试还是接口自动化&#xff0c;以及RD写的单元测试&#xff0c;我们一般使用代码覆盖率来衡量测试的完备程度&#xff0c;这篇文章就带大家认识一下代码覆盖率这个常用质量完备度的指标 代码覆盖率测试与测试覆盖率在软件…

Elasticsearch扩展性探索:水平扩展与集群管理

在当今数据驱动的时代&#xff0c;搜索引擎和数据存储解决方案的重要性不言而喻。Elasticsearch&#xff0c;作为一款基于Lucene构建的开源、分布式、RESTful搜索引擎&#xff0c;凭借其强大的全文搜索、结构化搜索和分析能力&#xff0c;受到了众多企业和开发者的青睐。然而&a…

C++的标准容器及其应用

C的标准容器及其应用 数组&#xff08;array&#xff09;数组的特征应用实列 前向列表&#xff08;forward_list&#xff09;前向列表的特征应用实列 列表&#xff08;list&#xff09;列表的特征应用实列 有序映射&#xff08;map&#xff09;有序映射的特征应用实列 队列&…

uniapp滚动加载

uniapp实现滚动加载&#xff0c;先获取10条数据&#xff0c;滚动到底时&#xff0c;再获取10条数据&#xff0c;以此类推&#xff0c;直至没有数据为止。 使用scroll-view&#xff0c;注意一定要给一个固定高度&#xff0c;隐藏滚动条会更美观 2. 在data中定义 3. 获取数据 …

【Ubuntu】修改计算机名称

在Ubuntu系统中&#xff0c;可以通过以下步骤来修改计算机名&#xff08;hostname&#xff09;&#xff1a; 方法一&#xff1a;临时修改计算机名 这种方法只会在当前会话中生效&#xff0c;重启后会恢复原来的计算机名。 sudo hostname 新计算机名请将新计算机名替换为你想…

3D三维模型展示上传VR全景创建H5开源版开发

3D三维模型展示上传VR全景创建H5开源版开发 新增三级分类&#xff08;项目分类、项目、默认场景&#xff09; 新增热点 前台创建项目、场景 场景跳转、提示信息 新增热点图标选择 新增预览场景是显示关联场景 新增3D模型展示功能 当然可以&#xff01;以下是一个关于3D三维模…

AndroidStudio|本地生成APK|build.gradle.kts配置

1. 准备密钥库 首先&#xff0c;你需要生成一个密钥库&#xff0c;用于签署你的 APK 文件。 使用 Android Studio 生成密钥库 打开你的 Android Studio 项目。点击 Build -> Generate Signed Bundle / APK...。选择 APK&#xff0c;然后点击 Next。点击 Create new... 按…

Gradle相关概念

目录 基本概念1、Plugin2、Task3、Configuration4、Extension 其他1、查看gralde源码2、查看Android-Gradle-Plugin源码3、查看shadowJar源码 基本概念 1、Plugin 配置插件 apply plugin: ‘xxx’动态添加插件 project.plugins.apply(ShadowJavaPlugin)2、Task 1、创建任务…

MySQL Explain 关键字详解

概述 explain 关键字可以模拟执行 sql 查询语句&#xff0c;输出执行计划&#xff0c;分析查询语句的执行性能 使用方式如下&#xff1a;explain sql explain select * from t1执行计划各字段含义 1. id 如果 id 序号相同&#xff0c;从上往下执行如果 id 序号不同&#…

php使用sockets实现Modbus TCP串口通信

sockets文档地址&#xff1a;https://www.php.net/manual/zh/book.sockets.php 一&#xff1a;安装sockets拓展 1&#xff1a;windows安装sockets 找到php.ini文件&#xff0c;将下面这行注释即可 extensionsockets 2&#xff1a;Linux安装sockets pecl install sockets …

MJ绘画设计基础——如何玩转midjourney?

抽卡的时候经常有一个问题&#xff0c;就是整张图都还不错&#xff0c;但是某些地方有些小问题&#xff0c;比如说手很奇怪&#xff0c;比如下面这个图&#xff0c;哪都挺好看&#xff0c;就是左手有点问题。 这时候就可以局部重绘来拯救一下 第一次生成的图 点击图片下方的V…

(分治算法8)leecode 148 排序链表

题目描述 给你链表的头结点head&#xff0c;请将其按照升序排列并返回排序后的链表。 解答一&#xff1a;使用递归法进行归并排序 分割环节&#xff1a;找到当前链表的中点&#xff0c;并从中点将链表断开以方便在下次递归的时候cut&#xff0c;链表的片段拥有正确的边界我们…

Java快速开发:力推开源项目若依RuoYi

在Java开发开源框架中&#xff0c;首屈一指的应该若依&#xff0c;在行业里&#xff0c;不管小公司中公司还是大公司&#xff0c;都能够看到若依项目的身影。足以见得 若依框架的受众之大。 RuoYi-Cloud RuoYi-Cloud 是一个 Java EE 分布式微服务架构平台&#xff0c;基于经典…

希腊字母表及其读音

希腊字母是希腊语的字母系统&#xff0c;也被广泛用于数学、物理、化学、工程等领域作为符号标记。 下面是希腊字母表及其读音&#xff1a; Α α (Alpha) - 读作 /ˈlfə/Β β (Beta) - 读作 /ˈbeɪtə/Γ γ (Gamma) - 读作 /ˈgmə/Δ δ (Delta) - 读作 /ˈdɛltə/Ε …

基于新型切片轮廓转换超分辨率的深度生成网络的高分辨率3D MRI重建

高分辨率磁共振成像(MRI)序列,如3D Turbo或快速自旋回波(TSE/FSE)成像,在临床上备受欢迎,但在转换成首选方向时往往因扫描时间过长而产生模糊问题。因此,常常采用多层面二维(2D)TSE成像,因其高平面分辨率而被广泛使用,但在临床上由于体素拉长和由于阶梯状伪影而导致的横向…