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

下一个排列

题目链接

下一个排列

题目描述


注意点

  • 必须 原地 修改,只允许使用额外常数空间
  • 如果不存在一个字典序更大的排列,则返回字典序最小的排列
  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 100

解答思路

  • 找到下一个配列的关键是找到比当前字典序更大的字典序,同时要保证字典序的增幅最小(不存在字典序更大的特殊情况除外)
  • 怎样找到增幅最小的更大字典序?观察规律可得,要保证字典序更大,需要将数组中前面某个较小的数字与后面某个较大的数字进行交换;要保证增幅更大,则需要从后往前找到第一个nums[i] < nums[i + 1]的数nums[lastMin],再从后往前找到第一个比nums[lastMin]大的数比nums[lastMax]大的数,将两个数进行交换,随后将lastMin左侧的数组变为升序排列即可(此时左侧的数组一定按降序排列)
  • 需要特殊考虑的是,如果此时数组已经是最大字典序,则下一个排列是最小字典序,此时数组是降序排列的,只需要将数组改为升序排列即可

代码

class Solution {public void nextPermutation(int[] nums) {int n = nums.length;// 从后往前找到第一个nums[i] < nums[i + 1]的数int lastMin = n - 2;while (lastMin >= 0 && nums[lastMin] >= nums[lastMin + 1]) {lastMin--;}// 如果数组非递减,从后往前第一个比nums[lastMin]大的数,与nums[lastMin]进行交换if (lastMin >= 0) {int lastMax = n - 1;while (lastMax > lastMin && nums[lastMax] <= nums[lastMin]) {lastMax--;}swap(nums, lastMin, lastMax);}// 将left右侧的数组改为升序(此时必定为降序)int left = lastMin + 1;int right = n - 1;while (left < right) {swap(nums, left, right);left++;right--;}}public void swap(int[] nums, int left, int right) {int tmp = nums[left];nums[left] = nums[right];nums[right] = tmp;}
}

关键点

  • 怎么找到下一个排列
  • 最大字典序的下一个排列特殊考虑

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • FFmpeg有理数相关的源码:AVRational结构体和其相关的函数分析
  • 英伟达显卡查看占用情况
  • 设计模式实战:报表生成系统的设计与实现
  • Chapter 22 数据可视化——折线图
  • Chapter 26 Python魔术方法
  • 用phpstudy搭建MySQL数据库
  • WebKit 的简介及工作流程
  • 科普文:JUC系列之多线程门闩同步器CountDownLatch的使用和源码
  • C++STL专题-string类
  • 低代码: 技术实现概述
  • 部署k8s+conatinerd环境
  • 【学习笔记】后缀自动机(SAM)
  • 【MySQL】索引——索引的引入、认识磁盘、磁盘的组成、扇区、磁盘访问、磁盘和MySQL交互、索引的概念
  • 微信小程序 - 自定义计数器 - 优化(键盘输入校验)
  • 在VScode中导入conda环境的记录【原创】
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • es6(二):字符串的扩展
  • idea + plantuml 画流程图
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Java比较器对数组,集合排序
  • Java到底能干嘛?
  • SQL 难点解决:记录的引用
  • Vue ES6 Jade Scss Webpack Gulp
  • 动态魔术使用DBMS_SQL
  • 开源SQL-on-Hadoop系统一览
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 力扣(LeetCode)22
  • 入门级的git使用指北
  • 深入浅出Node.js
  • 数组大概知多少
  • 学习HTTP相关知识笔记
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • ​flutter 代码混淆
  • ​io --- 处理流的核心工具​
  • ​queue --- 一个同步的队列类​
  • #include<初见C语言之指针(5)>
  • #include到底该写在哪
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #pragma预处理命令
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (20050108)又读《平凡的世界》
  • (35)远程识别(又称无人机识别)(二)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (阿里云万网)-域名注册购买实名流程
  • (二)WCF的Binding模型
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (六)vue-router+UI组件库
  • (论文阅读40-45)图像描述1
  • (算法)求1到1亿间的质数或素数
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法