实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
——————————————————
解题思路:首先需要知道字典序的意思,意思的数组的排序是按照字典的规则排序的。


对于上面这个数组,按照字典序,下一个较大的字典序为

也就是首先将图中的5和4进行交换,那么数字由158476531变为158576431,也就是在4之后的所有数字中选择一个大于4的最小值,也就是5。然后需要对交换后的76531进行排序,变为13567,数字就变为158513467。

因此我们整体的计算方法为:
(1)倒序遍历,当nums[i]<nums[i+1]的时候,就得到了要交换的数值。比如上面的4;
(2)从4向后遍历,4的位置为nums[i],当遍历到nums[k]>nums[i]>nums[j]时,将nums[k]和nums[i]的位置进行交换;
(3)将nums[i]之后的数据进行从小到大排序;

其Python代码如下:

class Solution:def nextPermutation(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""length = len(nums)i = length - 2while i>=0 and nums[i] >= nums[i+1]:  # 找到nums[i]<nums[i+1]的位置i-=1if i>=0: # 交换位置j = i+1while j<length and nums[j]>nums[i]:j+=1temp = nums[j-1]nums[j-1] = nums[i]nums[i] = tempL = i+1  # 将nums[i]之后的数据进行排序R = length-1while L<R:temp = nums[L]nums[L] = nums[R]nums[R] = tempL+=1R-=1

leetcode —— 31. 下一个排列相关推荐

  1. Java实现 LeetCode 31下一个排列

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

  2. LeetCode 31. 下一个排列(线性扫描)

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

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

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

  4. LeetCode.31 下一个排列

    题目描述 实现获取下一个排列的算法,算法需要将给定的数组,重新排列成下一个更大的排列(即组合出下一个更大的数字). 如果不存在下一个更大的排列,则将数字重新排列成最小的排列. 题目思路 我们可以使用如 ...

  5. leetcode 31.下一个排列

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

  6. LeetCode 31. 下一个排列 Next Permutation

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

  7. LeetCode 31 下一个排列

    https://leetcode-cn.com/problems/next-permutation/ 解决方案 class Solution {public void nextPermutation( ...

  8. 【LeetCode】【HOT】31. 下一个排列

    [LeetCode][HOT]31. 下一个排列 文章目录 [LeetCode][HOT]31. 下一个排列 package hot;import java.util.Arrays;public cl ...

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

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

最新文章

  1. 和12岁小同志搞创客开发:拿到一款控制器,要怎么分析?
  2. 机器学习 —— 概率图模型(推理:连续时间模型)
  3. Vivado HLS error: Cannot find ISE in the PATH variable or it's an unsupported version
  4. RedHat 关闭selinux
  5. [第16天]IIS UNICODE 编码漏洞
  6. (原创)浅谈任意文件下载漏洞的利用
  7. win服务器创建文件夹命令,Win10系统如利用命令提示符或WSL创建任意大小空白文件...
  8. 基于.NET Standard的分布式自增ID算法--Snowflake
  9. 沃尔沃主动召回40万台车,只因一个罕见的问题
  10. 小学用计算机画画的课件,用计算机画图画.ppt
  11. 定制Eclipse IDE之功能篇(二)
  12. C#调用GDI+1.1中的函数实现高斯模糊、USM锐化等经典效果。
  13. Android App 启动时立即崩溃无法debug的解决方法
  14. 一个游戏是如何被设计和开发出来的
  15. JAVA验证码存在哪里了_java实现验证码功能
  16. 前端实现Office在线预览 (一)
  17. cenos回到linux桌面快捷键,CentOS 常用命令及快捷键整理
  18. 高斯法计算矩阵的行列式
  19. Android卡顿掉帧问题分析之原理篇
  20. vscode win10笔记本 蓝屏_遇到win10电脑蓝屏怎么办_简单解决win10蓝屏的方法

热门文章

  1. Mobile and MID opportunities in APAC
  2. 结合 live-reload 实现自动刷新
  3. 面试官系统精讲Java源码及大厂真题 - 17 并发 List、Map源码面试题
  4. 容器编排技术 -- Kubernetes 架构
  5. 使用Python批量压缩图片
  6. C#中的异步编程--探索await与async关键字的奥妙之处,原来理解和使用异步编程可以这么简单
  7. Android BGradualProgress 多种渐变、直角or弧角、进度条、加载条
  8. 使用dockerfile自动化构建镜像
  9. js 闭包函数 构造函数_JavaScript中的闭包,库里函数和酷抽象
  10. mvp最小可行产品_我们如何打造最低可行产品(MVP)