题目描述

实现获取下一个排列的算法,算法需要将给定的数组,重新排列成下一个更大的排列(即组合出下一个更大的数字)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列。

题目思路

我们可以使用如下的思路来解决这个问题:

  • 首先从后往前找到第一个升序排列的相邻元素对([nums[i]<nums[i+1]),其中把相邻元素对中较小的下标记为 i

    • 如果 i 小于等于 0,那么说明这个数组是一个严格降序的数组,那么直接把数组反转并返回即可
  • 接下来从 [i+1, nums.length-1] 范围中,从后往前找到第一个 >= nums[i] 的元素,下标记为 j
  • 交换 ij 下标的元素
  • [i+1, nums.length-1] 范围内的元素反转

实现代码

public void nextPermutation(int[] nums) {int i = nums.length-2;while (i>=0 && nums[i]>=nums[i+1]) {i--;}if (i < 0) {//如果 i 小于等于 0,说明这个数组是一个完全降序的数组//直接反转即可reverse(nums, 0, nums.length-1);return ;}//否则,从 [i+1, nums.length-1] 区间内,从后往前找到第一个比 nums[i] 大的数int j = nums.length-1;while (j>i && nums[j]<=nums[i]) {j--;}//交换两个元素的位置swap(nums, i, j);reverse(nums, i+1, nums.length-1);
}private void reverse(int[] nums, int start, int end) {while (start < end) {swap(nums, start, end);start++;end--;}
}private void swap(int[] nums, int i, int j) {int t = nums[i];nums[i] = nums[j];nums[j] = t;
}

LeetCode.31 下一个排列相关推荐

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

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

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

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

  3. leetcode —— 31. 下一个排列

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

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

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

  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. 心理所发表关于神经科学研究可信度的评论文章
  2. P2P网络中DHT算法分析
  3. Java黑皮书课后题第2章:*2.8(当前时间)程序清单2-7给出了显示当前格林尼治时间的程序。修改这个程序,提示用户输入相对于GMT的时区偏移量,显示在这个特定时区的时间
  4. HTML5 input 类型
  5. Mysql 的uuid()函数以及replace()函数使用
  6. js识别用户设备是移动端手机时跳转到手机网站
  7. C++string基本概念
  8. 牛课网--直通BAT面试算法精讲课--送优惠码啦
  9. py交易----实验吧
  10. web全栈工程师(前端进阶)学习线路图
  11. iso shell vg220齿轮油_CLP220齿轮油性能
  12. 湖北工程学院计算机基础实验报告,学院圆满举行2019级《计算机应用基础》 第一批线上测试试点工作...
  13. Ubuntu16.04中python升级到3.6版本后Terminal打不开的解决方法
  14. Spring @Scheduled 使用详解
  15. SF-60/385/4PY智能浪涌保护器 带遥信功能 四川 重庆项目大力推荐应用 带通讯 上防雷系统平台
  16. 国外10个优秀域名工具站点 帮助搜索好域名
  17. java计算机毕业设计校园快递联盟系统源码+数据库+系统+lw文档+mybatis+运行部署
  18. 适合小白入门的随机森林介绍
  19. 华通-小天 IDC
  20. web容器的加载过程

热门文章

  1. 7 种分布式全局 ID 生成策略,你更爱哪种?
  2. 一文彻底搞懂Java中的值传递和引用传递!
  3. js的navigator对象的使用(浏览器信息)
  4. Oracle 练习作业10.1-1-2
  5. Promethus搭建 K8S 集群节点资源监控系统
  6. docker登录mysql数据库_Docker下搭建mysql数据库
  7. 计算机专业英语的理解,计算机专业英语之理解网络地址
  8. 如何在linux下启动和关闭oracle服务
  9. in ms sql 集合参数传递_mybatis从入门到精通,第三篇《动态SQL》,干货满满
  10. C#session共享+redis_技术干货分享:基于SpringBoot+Redis的Session共享与单点登录