LeetCode.31 下一个排列
题目描述
实现获取下一个排列的算法,算法需要将给定的数组,重新排列成下一个更大的排列(即组合出下一个更大的数字)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列。
题目思路
我们可以使用如下的思路来解决这个问题:
- 首先从后往前找到第一个升序排列的相邻元素对(
[nums[i]<nums[i+1]
),其中把相邻元素对中较小的下标记为i
- 如果
i
小于等于0
,那么说明这个数组是一个严格降序的数组,那么直接把数组反转并返回即可
- 如果
- 接下来从
[i+1, nums.length-1]
范围中,从后往前找到第一个>= nums[i]
的元素,下标记为j
- 交换
i
与j
下标的元素 - 将
[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 下一个排列相关推荐
- Java实现 LeetCode 31下一个排列
31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...
- LeetCode 31. 下一个排列(线性扫描)
1. 题目 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外 ...
- leetcode —— 31. 下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...
- Leetcode 31. 下一个排列 (每日一题 20210831)
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数).如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列).必须 原地 ...
- leetcode 31.下一个排列
题目 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空 ...
- LeetCode 31. 下一个排列 Next Permutation
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...
- LeetCode 31 下一个排列
https://leetcode-cn.com/problems/next-permutation/ 解决方案 class Solution {public void nextPermutation( ...
- 【LeetCode】【HOT】31. 下一个排列
[LeetCode][HOT]31. 下一个排列 文章目录 [LeetCode][HOT]31. 下一个排列 package hot;import java.util.Arrays;public cl ...
- LeetCode每日一题--31. 下一个排列(数学)
题目:跳转至 31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原 ...
最新文章
- 心理所发表关于神经科学研究可信度的评论文章
- P2P网络中DHT算法分析
- Java黑皮书课后题第2章:*2.8(当前时间)程序清单2-7给出了显示当前格林尼治时间的程序。修改这个程序,提示用户输入相对于GMT的时区偏移量,显示在这个特定时区的时间
- HTML5 input 类型
- Mysql 的uuid()函数以及replace()函数使用
- js识别用户设备是移动端手机时跳转到手机网站
- C++string基本概念
- 牛课网--直通BAT面试算法精讲课--送优惠码啦
- py交易----实验吧
- web全栈工程师(前端进阶)学习线路图
- iso shell vg220齿轮油_CLP220齿轮油性能
- 湖北工程学院计算机基础实验报告,学院圆满举行2019级《计算机应用基础》 第一批线上测试试点工作...
- Ubuntu16.04中python升级到3.6版本后Terminal打不开的解决方法
- Spring @Scheduled 使用详解
- SF-60/385/4PY智能浪涌保护器 带遥信功能 四川 重庆项目大力推荐应用 带通讯 上防雷系统平台
- 国外10个优秀域名工具站点 帮助搜索好域名
- java计算机毕业设计校园快递联盟系统源码+数据库+系统+lw文档+mybatis+运行部署
- 适合小白入门的随机森林介绍
- 华通-小天 IDC
- web容器的加载过程
热门文章
- 7 种分布式全局 ID 生成策略,你更爱哪种?
- 一文彻底搞懂Java中的值传递和引用传递!
- js的navigator对象的使用(浏览器信息)
- Oracle 练习作业10.1-1-2
- Promethus搭建 K8S 集群节点资源监控系统
- docker登录mysql数据库_Docker下搭建mysql数据库
- 计算机专业英语的理解,计算机专业英语之理解网络地址
- 如何在linux下启动和关闭oracle服务
- in ms sql 集合参数传递_mybatis从入门到精通,第三篇《动态SQL》,干货满满
- C#session共享+redis_技术干货分享:基于SpringBoot+Redis的Session共享与单点登录