今天继续力扣数组标签的算法题,力扣第31题,难度等级为中等,题目描述如下:

题目要点概括如下:

1、输入部分为一个有顺序的数组,按照数字的前后顺序,这个数字代表着一个位数不定的数字,这里程它为原数字。

2、关于输出,要获得一个修改后的数字,如果原来数组中数字的其他排列组成的数字比原数字要大,那就输出与原数字最接近的更大值;如果原数字已经是原始数组所包含数字所能组成的最大数字,那就将这个数组整理为升序数组。

33、整个处理过程要求在原数组上完成,而且额外使用的空间有限且在整个过程中不发生变化。

通过分析一个数字,我们可以知道,当所包含的数字从高位到低位,是按照降序排列的(也就是高位上的数字始终比低一个位上的数字要大),那这个数字就是这些数字所能组成的最大数字;同理,如果这些数字时按照升序排列的,那这个数字就是这些数字所能组成的最小数字。如此看来,判断是否还有更大的数字存在,只需要判断这个数字里的各个位是不是按照降序排列的就OK了。

判断数组中从第一个到最后一个是否是按照降序,只有一个办法,那就是遍历,可以选择从头开始遍历,当然也可以从最后一位开始遍历。

(但是本题中使用从最后一个开始更方便,分析完整个题目就很清楚了)

我们先来处理没有更大的数字时的情况,没有更大的数字,那就说明这个数字最大,也就是反应了这个数字中的各个位数是降序排列的,那我们现在改为升序,就只需要将整个数组前后颠倒一下。

再来分析存在更大值的情况。

既然存在更大值,通过之前我们的分析也可以看出,一定是存在一个位置,高位的数字小于低位的数字,那这就是我们需要进行调整的地方了。

那我们是将二者交换就拿到我们所要的数组了么?

并没有那么简单。

第一,我们选择交换的数字,应当是出现错位的数字(图中的数字 4 )和他的后面大于这个数字,同时是最小的数字( 图中的数字 5 ),这样才能保证更改的这一位相对来说变化最小。

(由于要找之后的几位中大于该位且最小的,而且这部分是降序的,所以从后边往前进行循环,出现的第一个大于要错位数字的数,就是我们需要的,这也就是我们选择从后面进行循环的原因)

第二,因为在交换后,这两位的后面几位仍然存在着升序和降序的问题。而之前我们也分析过,一个位数确定的数字,要拿到最小值,就一定是升序的。所以,要拿到最接近原数字的新数字,还需要交换过的后面几位进行局部的升序处理。

代码如下:

public 

位置①处代码实现找到要更换为位置

位置②和③分别是实现交换和排列功能。

此外,看了眼官方给的代码,用的是whil循环,更加简洁,也贴出来:

public class Solution {public void nextPermutation(int[] nums) {int i = nums.length - 2;while (i >= 0 && nums[i + 1] <= nums[i]) {i--;}if (i >= 0) {int j = nums.length - 1;while (j >= 0 && nums[j] <= nums[i]) {j--;}swap(nums, i, j);}reverse(nums, i + 1);}private void reverse(int[] nums, int start) {int i = start, j = nums.length - 1;while (i < j) {swap(nums, i, j);i++;j--;}}private void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
}作者:LeetCode
链接:https://leetcode-cn.com/problems/next-permutation/solution/xia-yi-ge-pai-lie-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

另:官方解法给出了了动图,更方便理解,由于下载失败,贴出连接:

力扣​leetcode-cn.com

今天的刷题就是这样。

这个系列主要来记录和回滚,如果感觉写的还能看,欢迎转发评论、点赞关注喔

按照惯例,倒一下前两天缩写:

昨天:

王进林:菜鸡刷LeetCode系列记录8 删除重复项​zhuanlan.zhihu.com

王进林:菜鸡刷LeetCode系列记录9 移除元素​zhuanlan.zhihu.com

前天:

王进林:菜鸡刷LeetCode系列记录7 四数之和​zhuanlan.zhihu.com

下一天的:

王进林:菜鸡刷LeetCode系列记录11 搜索旋转排序数组​zhuanlan.zhihu.com

数组的合并和升序排列_每日“力扣”系列10 下一个排列相关推荐

  1. 数组的合并和升序排列_leetcode No.31 下一个排列

    题目链接: 下一个排列 - 力扣(LeetCode)​leetcode-cn.com 题目描述: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个 ...

  2. LeetCode 热题 HOT 100 -------31. 下一个排列(数组,数学问题)128. 最长连续序列(数组) 11. 盛最多水的容器(数组) 621. 任务调度器 (数组)

    dsadas /**思路:找下一个排列,并且尽可能小,所以我们应该找一序列中从左边开始的"较小值"与"较大值"交换,但是为了尽可能小应该满足: 1." ...

  3. Leetcode 31. 下一个排列 (每日一题 20210831)

    实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数).如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列).必须 原地 ...

  4. LeetCode每日一题--31. 下一个排列(数学)

    题目:跳转至 31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原 ...

  5. 下一个全排列_下一个排列

    下一个全排列 Problem statement: 问题陈述: Given a permutation print permutation just greater than this. 给定一个排列 ...

  6. 《LeetCode力扣练习》第31题 下一个排列 Java

    <LeetCode力扣练习>第31题 下一个排列 Java 一.资源 题目: 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列. 例如,arr = [1,2,3] ,以下这些都可 ...

  7. Leecode31. 下一个排列——Leecode大厂热题100道系列

    我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...

  8. 下一个排列Python解法

    整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列. 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3].[1,3,2].[3,1,2].[2,3,1] . ...

  9. Leetcode--31. 下一个排列

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...

最新文章

  1. 2pc oracle dba_2pc_pending,dba_2pc_pending视图中的信息不清除会对以后有影响吗?如何根本解决问题?...
  2. 试验ConcurrentHashmap
  3. 图像迁移风格保存模型_图像风格迁移也有框架了:使用Python编写,与PyTorch完美兼容,外行也能用...
  4. 如何监控Android电视桌面,androidTV 电视桌面的效果
  5. oracle数据库创建用户
  6. windows查找端口占用情况
  7. IntelliJ IDEA设置maven
  8. 学习web前端技术的笔记,仅供自己查阅备忘,移动对font-size的控制(并非原创)...
  9. 3d打印技术是计算机在哪一方面的应用,3D打印技术的应用范围 3D打印技术的应用领域有哪些?...
  10. 互联网面试六大常见问题及应对技巧,2021不再入坑!
  11. JavaScript:九九乘法表
  12. 软件测试自学怎么学?
  13. matlab里面sin函数是角度,matlab-如何用matlab编写sin函数要求定义一 – 手机爱问
  14. java(jfinal) 接入ios苹果内购(连续包月订阅),服务端将二次验证。
  15. 720phi10p 和 720p有什么区别_红米note9和红米9哪个好_红米note9和红米9的区别
  16. Windows组策略应用全攻略
  17. 微信聊天记录成合法证据;中兴重启5G测试;京东推出机器人地图 | 极客头条...
  18. JavaScript 无法获取响应 header 的 Content-Disposition 字段
  19. python爬虫 爬取淘女郎介绍以及照片
  20. 小时光扫地机器人圆圆_我也有了扫地机器人“圆圆”,漫天猫毛不愁了

热门文章

  1. 编码规范(代码优化)
  2. Omnibus test
  3. PHP-CGI进程占用过多CPU
  4. 关于tomcat和jetty的乱码问题
  5. Mysql:执行source sql脚本时,出现:error 2
  6. 数据库设计优化经验谈(转载)
  7. ZOJ-1094-Matrix Chain Multiplication
  8. 在iOS项目中,这样才能完美的修改项目名称
  9. 评教数据的存储和显示问题
  10. CGO磁盘管理For流星无语