CodeTop050 下一个排列
下一个排列
两遍扫描:
步骤一:首先从后向前查找第一个顺序对(i,i+1)满足a[i]<a[i+1].这样「较小数」即为a[i].此时[i+1,n)必然是下降序列
步骤二:如果找到了顺序对,那么在区间[i+1,n)中从后向前查找第一个元素j满足a[i]<a[j].这样「较大数」即为a[j]
步骤三:交换a[i]与a[j],此时可以证明区间[i+1,n)必为降序.我们可以直接使用双指针反转区间[i+1,n)使其变为升序,而无需对该区间进行排序
注意:如果在步骤1找不到顺序对,说明当前序列已经是一个降序序列,即最大的序列,我们直接跳过步骤2执行步骤3,即可得到最小的升序序列
public void nextPermutation(int[] nums) {
int i = nums.length - 2;
while (i >= 0 && nums[i + 1] <= nums[i]) {
i–;
}//i就是那个较小数if (i >= 0) {int j = nums.length - 1;while (j >= 0 && nums[i] >= nums[j]) {j--;}//j就是右边那个最小的比i大的数swap(nums, i, j);}//将右侧的升序改为降序reverse(nums, i + 1, nums.length - 1); }public void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp; }public void reverse(int[] nums, int left, int right) {while (left < right) {swap(nums, left, right);left++;right--;} }
举一反三:实现 上一个排列
和上面的思想是一样的,只是判断的条件有一些变化(判断条件全部一改 就是上一个排列的代码)
public static void frontPermutation(int[] nums) {int i = nums.length - 2;while (i >= 0 && nums[i] <= nums[i + 1]) {i--;}//i就是那个最小的较大数if (i >= 0) {int j = nums.length - 1;while (j >= 0 && nums[j] >= nums[i]) {j--;}//找到右边比i小的数swap(nums, i, j);}//右侧的降序翻转为升序reverse(nums, i + 1, nums.length - 1);}public static void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}public static void reverse(int[] nums, int left, int right) {while (left < right) {swap(nums, left, right);left++;right--;}}
CodeTop050 下一个排列相关推荐
- 《LeetCode力扣练习》第31题 下一个排列 Java
<LeetCode力扣练习>第31题 下一个排列 Java 一.资源 题目: 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列. 例如,arr = [1,2,3] ,以下这些都可 ...
- Leetcode 31. 下一个排列 (每日一题 20210831)
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数).如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列).必须 原地 ...
- LeetCode 30串联所有单词的子串31下一个排列
标题 串联所有单词得字串 下一个排列 维护真的不易,如有帮助还请点赞关注,关注公众号bigsai回复进群即可加入打卡. 串联所有单词得字串 题目描述: 给定一个字符串 s 和一些长度相同的单词 wor ...
- 下一个排列—leetcode31
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...
- Leecode31. 下一个排列——Leecode大厂热题100道系列
我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...
- 下一个排列Python解法
整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列. 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3].[1,3,2].[3,1,2].[2,3,1] . ...
- 数组的合并和升序排列_leetcode No.31 下一个排列
题目链接: 下一个排列 - 力扣(LeetCode)leetcode-cn.com 题目描述: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个 ...
- leetcode31. 下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...
- LeetCode 31. 下一个排列(线性扫描)
1. 题目 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外 ...
最新文章
- 大赛季(2020)新一代信息技术行业赛赛事公告
- Nuget服务的搭建-打包-上传-删除
- linux 命令博客,Linux 命令
- Windows 技术篇 - 如何查看cpu支持的指令集、型号、属性等详细信息,使用cpu-z工具查看处理器、内存、显卡、主板、缓存、SPD信息方法
- .Net NPOI 根据excel模板导出excel、直接生成excel
- 项目经理主要工作职责
- python将页面保存为html_python – :将html保存为文本
- 在置信区间下置信值的计算_使用自举计算置信区间
- P1742 最小圆覆盖
- 如何快速搭建yum源和成功检测第三方软件
- 下个目标是攻克FIFA游戏?DeepMind让AI自学传球配合
- 计算机网络性能(2)
- Recoverit for Mac(数据恢复软件)
- centos 计算器_在Linux命令行中使用计算器的5个命令
- 英文字母对应的Unicode编码
- 【 机器学习】入门,理论框架以及学习资料
- 邮件作为证据如何提交_【欣法官在线】收到起诉状副本,我该如何向法院提交证据?...
- rocketmq获取消息id_贞炸了!上线之后,消息收不到了!
- HTML/CSS/Javascript在线代码运行网站汇总
- 深度学习笔记~感受野(receptive field)的计算
热门文章
- 牛客网SQL实战二刷 | Day2
- 台积电7nm+ EUV工艺已量产 华为新一代旗舰处理器麒麟985将率先使用
- 上海人民正式对垃圾分类了,美国科技清垃圾产业投资创纪录
- 张岚老师--上海沪师经纪--刘建
- 从分析家中得到股票数据!C#源码 (代码很长,建议火狐)
- 华为java实习生面试_华为java实习生一面总结
- 金融行业要翻软件定义存储SDS的牌子了吗?
- sun公司的java入门
- 计算机培训会新闻稿,电子科技协会电子知识讲座新闻稿
- linux oracle lrm00109,Oracle:ORA-01078与LRM-00109报错