31. 下一个排列
题目描述
整数数组的一个排列 就是将其所有成员以序列或线性顺序排列。
例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。
整数数组的下一个排列是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。 类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。
给你一个整数数组 nums ,找出 nums 的下一个排列。
必须原地修改,只允许使用额外常数空间。
示例1:
输入:nums = [1,2,3]
输出:[1,3,2]
示例2:
输入:nums = [3,2,1]
输出:[1,2,3]
示例3:
输入:nums = [1,1,5]
输出:[1,5,1]
解题思路
根据题目描述,这里得到两个限制条件:1,在原来的基础上增加 2,增加的要是最少
- 第一个条件:将后面的大数和前面的小数进行交换,即可增大数值。如13456,将6和3交换就可以得到一个更大的数16453
- 第二个条件:交换的数尽可能的靠后,如将5和6交换得到的数13465会比16453小。此外,对第一个交换位置后的数字进行升序排列,将大数往后移,即可以得到更小的数值,如将6和3进行交换后得到16453,再将第一个交换位置6后面的数字进行升序排列,得到16345,会比原来大,但是数值更小了。
故可以总结出算法(这里就使用题解给出的算法):
- 首先从后向前查找第一个顺序对 (i,i+1),满足 a[i]<a[i+1]。这样「较小数」即为 a[i]。此时 [i+1,n)必然是下降序列。
- 如果找到了顺序对,那么在区间 [i+1,n)中从后向前查找第一个元素 j 满足a[i]<a[j]。这样「较大数」即为 a[j]。
- 交换 a[i]与 a[j],此时可以证明区间 [i+1,n)必为降序。我们可以直接使用双指针反转区间 [i+1,n)使其变为升序,而无需对该区间进行排序。
拿一个序列举例:
输入:[5, 4, 7, 5, 3, 2]
输出:[5, 5, 2, 3, 4, 7]
首先从后往前找到第一个元素,使a[i]<a[i+1],即为4,定位较小数
然后从后往前找到第一个元素,使a[j]>a[i],即为5,定位较大数
将较小数和较大数进行交换,得到5,5,7,4,3,2
对较小数位置后面的数进行升序排列,得到5,5,2,3,4,7,即为最终答案
代码
class Solution {public void nextPermutation(int[] nums) {// 判断是否使降序数组,降序数组直接返回升序结果int flag = 0;for(int i = 0;i < nums.length-1; i++){if(nums[i] < nums[i+1]){flag = 1;break;}}if(flag == 0){// 若数组是完全降序排列,则变为升序即可Arrays.sort(nums);}else{int p = 0, q = 0;// 找到较小数for(q = nums.length-2; q >= 0; q --)if(nums[q] < nums[q+1])break;// 找到较大数for(p = nums.length-1; p > q; p --)if(nums[q] < nums[p])break;// 交换两个数swap(nums, p, q);// 将较小数索引后面的数按升序排列,因为是降序排列,所以只需要逆置即可reverse(nums, q+1);}}public void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}public void reverse(int[] nums, int start) {int left = start, right = nums.length - 1;while (left < right) {swap(nums, left, right);left++;right--;}}
}
相关文章:
31. 下一个排列
题目描述 整数数组的一个排列 就是将其所有成员以序列或线性顺序排列。 例如,arr [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的下一个排列是指其整数的下一个字典序更大的排列。更正式地&…...
Android笔记: mkdirs不生效失败
Manifest已经配置权限,代码中也动态获取权限,mkdirs一直返回false File.mkdirs()方法创建文件夹失败 1、动态申请读写权限 <!--SDCard写权限--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--SDCard读权…...
需要添加的硬币的最小数量(Lc2952)——贪心+构造
给你一个下标从 0 开始的整数数组 coins,表示可用的硬币的面值,以及一个整数 target 。 如果存在某个 coins 的子序列总和为 x,那么整数 x 就是一个 可取得的金额 。 返回需要添加到数组中的 任意面值 硬币的 最小数量 ,使范围 …...
军工保密资质介绍及申请要求
军工保密资质介绍 军工保密资质是指国家对从事军工研发、生产、销售等活动的企事业单位进行的一种资质认证。该资质的核心目标是保护国家军事机密和军事技术秘密,确保国家安全和国防利益。军工保密资质的认证标准非常严格,涉及企业的安全管理、技术保密…...
ES6的编程风格
ES6 提出了两个新的声明变量的命令:let和const。其中,let完全可以取代var,因为两者语义相同,而且let没有副作用。 var命令存在变量提升效用,let命令没有这个问题 if (true) {console.log(x); // ReferenceErrorlet x…...
springboot 载入自定义的yml文件转DTO
json解析的pom引入 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-json</artifactId><version>5.8.20</version></dependency>resources目录下的my-data.yml project:data:- name: service-genbase-package:…...
webpack-(plugin,本地服务器,路径别名,安装vue)
安装vue npm i vue-loader -D npm i vue 编写一个vue文件: 在index.html中设置 一个id为app的div 将vue文件挂载到app中 vue比较特殊,除了使用loader外,还使用了plugin const path require("path"); const { VueLoaderPlugin …...
http请求头导致了dial tcp:lookup xxxx on 10.43.0.10:53 no sunch host
事实证明人有的时候也不能太偷懒,太偷懒容易给自己埋坑。 问题的背景: web端调用服务A,服务A异步调用服务B。服务A有四个场景需要调用服务B,所以,服务A中封装了一个公用的方法,唯一的区别是,场…...
想要设计放大电路,必须掌握哪些?
放大电路是电子系统中的核心组成部分,其设计好坏将直接影响到整个系统的性能,对电子工程师来说,在设计放大电路时,必须掌握且关注多方面,以此确保电路的稳定性和放大效果,那么需要注意哪些? 1、…...
每天五分钟计算机视觉:基于卷积操作完成滑动窗口的图片分类?
本文重点 我们前面学习了使用不同大小的滑动窗口来滑动图片,然后切分成许多小的图片,然后依次应用到我们已经训练好的图像分类模型中,但是这种方式效率太低了,本节课程我们学习一种新的方式,来看一下如何并行识别这些剪切的图片。 原始结构 首先我们先来看一下,如何把…...
UI设计/交互设计/视觉设计项目汇报/作品集Figma/PPT模板
作为UI设计/交互设计/视觉设计师,创建作品集对于向潜在客户或雇主展示您的技能、创造力和风格至关重要。以下分步指南可帮助您创建令人印象深刻的作品集: 选择您的最佳作品:选择您最强大且最相关的设计项目,将其纳入您的作品集。…...
25、Lua 学习笔记之三(高阶话题)
Lua 学习笔记之三 高阶话题迭代实例代码有关迭代的描述 协作线程实例代码有关协作线程的描述 高阶话题 迭代 实例代码 --迭代 local function enum(array)local index 1return function()local ret array[index]index index 1return retend endlocal function foreach(a…...
企业网盘搭建——LNMP
php包链接:https://pan.baidu.com/s/1RElYTQx320pN6452N_7t1Q?pwdp8gs 提取码:p8gs 网盘源码包链接:https://pan.baidu.com/s/1BaYqwruka1P6h5wBBrLiBw?pwdwrzo 提取码:wrzo 目录 一.手动部署 二.自动部署 一.手动部署 …...
Go语言异常处理方式
Go 语言没有传统的异常处理机制,如 Java、C 或 Python 中的 try-catch 语句。取而代之,Go 采用了基于返回错误值和 panic/recover 机制的混合模式来进行错误处理。以下是 Go 语言中处理异常(或称错误)的两种主要方式: …...
时序分析基本知识点
【FPGA开发/IC开发之时序约束最全面的归纳总结】时序路径基本概念及时序约束分析方法_时序约束指令-CSDN博客...
ELK(Elasticsearch+Logstash+Kibana)日志分析系统
目录 前言 一、ELK日志分析系统概述 1、三大组件工具介绍 1.1 Elasticsearch 1.1.1 Elasticsearch概念 1.1.2 关系型数据库和ElasticSearch中的对应关系 1.1.3 Elasticsearch提供的操作命令 1.2 Logstash 1.2.1 Logstash概念 1.2.2 Logstash的主要组件 1.2.3 Logsta…...
【投稿优惠-EI稳定检索】2024年地理信息技术与遥感测绘国际学术会议(ICGITRSM 2024)
2024 International Conference on Geographic Information Technology and Remote Sensing Mapping (ICGITRSM 2024) ●会议简介 2024年地理信息技术与遥感测绘国际学术会议将聚焦于地理信息技术及遥感测绘领域的最新发展与应用。本次会议汇聚了来自世界各地的顶尖专家和学者…...
MySQL的内外连接
📟作者主页:慢热的陕西人 🌴专栏链接:MySQL 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容主要介绍了MySQL中的内外连接 文章目录 MySQL的内外连接…...
Pandas连接MySQL数据库
pandas是一个强大的Python工具包,能够快速帮助我们做很多数据处理。但是在利用pandas连接数据库时,也会遇到很多问题,在此我总结了一个相对较为简单的连接范式,供大家参考学习。 先上代码: import pandas as pd# 数据…...
2024华中杯数学建模参考思路+完整代码+后续成品论文预约
(完整版资料获取在文末哦) 关于24年华中杯的更新进度,大家可以参考我们前年比赛。 22年华中杯思路: 大家也可以看这一篇 A题思路 一订单包含多种货品,每种商品有不同的数量,题目没说订单的需求时间&am…...
Excel双坐标折线图保姆级教程:用散点图搞定多组数据对比(附详细步骤图)
Excel双坐标折线图进阶指南:用散点图实现精准数据可视化 在数据分析的日常工作中,我们经常遇到需要同时展示两组量纲差异巨大的数据——比如销售额(百万级)和增长率(百分比)。传统的双坐标折线图虽然能解决…...
APScheduler避坑指南:解决定时任务重复执行和时区问题的5种实战方案
APScheduler生产级实战:彻底解决定时任务重复执行与时区混乱的终极方案 凌晨三点,服务器告警铃声突然响起——监控系统显示同一批数据处理任务在短时间内被重复执行了17次。这不是科幻场景,而是某电商平台在使用APScheduler时遇到的真实生产事…...
3步解锁数据自由:WeChatMsg让聊天记录成为数字资产
3步解锁数据自由:WeChatMsg让聊天记录成为数字资产 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMs…...
收藏!2026非科班/转行小白必看:3步切入AI大模型,月薪30w+实战路径
2026年的职场赛道,AI大模型依旧是绝对的“黄金风口”。 最新行业报告显示,AI相关岗位需求逆势增长37%,薪资领跑全行业,大厂校招起薪普遍突破25k。但一个残酷的现实是: 太多非科班、半路转行的程序员,还在门…...
避开这些坑!高德DragRoute插件获取路线坐标的5个常见问题解决方案
高德地图DragRoute插件实战:路线坐标获取的深度避坑指南 当开发者需要在地图上绘制复杂路线时,高德地图的DragRoute插件无疑是个强大工具。但在实际项目中,从简单的A到B路径绘制,到包含多个途经点的复杂路线坐标获取,开…...
零中断迁移:企业级文档系统全流程实战指南
零中断迁移:企业级文档系统全流程实战指南 【免费下载链接】outline Outline 是一个基于 React 和 Node.js 打造的快速、协作式团队知识库。它可以让团队方便地存储和管理知识信息。你可以直接使用其托管版本,也可以自己运行或参与开发。源项目地址&…...
PyTorch 2.8镜像多场景落地:在线教育平台个性化习题生成引擎部署
PyTorch 2.8镜像多场景落地:在线教育平台个性化习题生成引擎部署 1. 教育行业的AI转型机遇 在线教育行业正面临个性化学习的迫切需求。传统题库系统存在内容同质化、更新成本高、难以匹配学生个体差异等问题。基于PyTorch 2.8构建的个性化习题生成引擎,…...
5倍效率提升:GIMP批量图像处理插件BIMP全攻略
5倍效率提升:GIMP批量图像处理插件BIMP全攻略 【免费下载链接】gimp-plugin-bimp 项目地址: https://gitcode.com/gh_mirrors/gi/gimp-plugin-bimp 在数字内容创作领域,批量图像处理是提升效率的关键环节。GIMP作为免费开源的图像编辑软件&#…...
基于Python的流浪动物救助平台毕业设计
博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在构建一个基于Python的流浪动物救助平台,以实现流浪动物的有效救助与管理工作。具体研究目的如下: 首先,通过构建流…...
从GitHub开源项目到一键部署:OFA模型在星图平台的快速落地
从GitHub开源项目到一键部署:OFA模型在星图平台的快速落地 1. 引言 你是不是也遇到过这种情况?在GitHub上看到一个特别酷的AI项目,比如OFA这种能看图说话、理解多模态信息的模型,心里痒痒的想立刻上手试试。结果呢,光…...
