下一个排列—leetcode31
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
思路:从后往前找到第一个nums[m]>nums[m-1]的位置m,分析此时m-1开始的序列保证都是降序排列的,那么继续从后往前找到第一个nums[j]>nums[m-1]的位置j,分析可知j>=m&&j<=n-1,找到j后调换索引m-1及j位置的值,并将m~n-1位置的值reverse即可,这样保证以最小的增量增大整个序列的值;
当然,如果整个序列为升序排列,那么直接reverse整个序列即可。
class Solution {
public:void nextPermutation(vector<int>& nums) {int n = nums.size();int m = n-1;for(;m>=1;--m){if(nums[m]>nums[m-1]){break;}}if(m>=1){int j=n-1;for(;j>=m;--j){if(nums[j]>nums[m-1]){swap(nums,j,m-1);break;}}reverse(nums,m,n-1);}else{reverse(nums,0,n-1);}return;}void swap(vector<int>& nums,int j,int m){int temp = nums[j];nums[j] = nums[m];nums[m] = temp;}void reverse(vector<int>& nums,int i,int j){while(i<j){swap(nums,i,j);i++;j--;}return;}
};
下一个排列—leetcode31相关推荐
- leetcode31. 下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...
- Leetcode--31. 下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...
- 20200217:下一个排列(leetcode31)
下一个排列 题目 思路与算法 代码实现 题目 思路与算法 我直接说思路不直观,直接上个例子来说明更加直观. 字典序这个就是正常的字面意思,123,132,213,231,312,321,这个顺序 举个 ...
- LeetCode31.下一个排列 JavaScript
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...
- 《LeetCode力扣练习》第31题 下一个排列 Java
<LeetCode力扣练习>第31题 下一个排列 Java 一.资源 题目: 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列. 例如,arr = [1,2,3] ,以下这些都可 ...
- Leetcode 31. 下一个排列 (每日一题 20210831)
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数).如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列).必须 原地 ...
- LeetCode 30串联所有单词的子串31下一个排列
标题 串联所有单词得字串 下一个排列 维护真的不易,如有帮助还请点赞关注,关注公众号bigsai回复进群即可加入打卡. 串联所有单词得字串 题目描述: 给定一个字符串 s 和一些长度相同的单词 wor ...
- Leecode31. 下一个排列——Leecode大厂热题100道系列
我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...
- 下一个排列Python解法
整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列. 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3].[1,3,2].[3,1,2].[2,3,1] . ...
最新文章
- 算法每日练习之判断完数
- Android禁止ViewPager的左右滑动
- USACO - 3.1.6 - Stamps
- reentrantlock非公平锁不会随机挂起线程?_【原创】Java并发编程系列16 | 公平锁与非公平锁...
- IDEA打开父类的接口方法快捷键
- C# 多线程同步和线程通信
- mooc中的习题--然后是几点
- 系统学习深度学习(八)--损失函数
- 凸优化第四章凸优化问题 4.1 优化问题
- java 高级查询插件_javascript高级组合查询控件(0.4更新)
- ecno是什么的缩写_美国的英文缩写是什么简写
- 一种可调电子负载电路/可调恒流源电路
- 工厂都离不开的“人机料法环”
- Uipath的下载与使用教程
- 拉肚子差评回复模板_女子吃外卖烧烤后拉肚子给差评,老板电话骂人后还说“欧耶”...
- HTML上标和下标原理,HTML标签:上标、下标
- word文件限制编辑如何解除
- HBase:项目之电信信号强度诊断介绍(第一阶段:了解整个项目相关信息)
- PC与三菱PLC 485BD模块 无协议通讯模式
- 概率算法c++语言,计算结果总和的概率的算法
热门文章
- 进入环境_如何进入Windows恢复环境(WinRE)
- Using libcurl in VC++
- python IDLE中反斜杠显示为人民币符号¥的解决办法
- 几种简单的排序算法(JAVA)
- java(eclipse)和数据库(mysql)的连接
- HTML data属性简介以及低版本浏览器兼容算法
- Knockoutjs 实践入门 (2) 绑定事件
- C#线程通信与异步委托
- [LeetCode] Remove Duplicates from Sorted List - 链表问题
- iOS之深入解析Block的底层原理