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

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

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

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
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相关推荐

  1. leetcode31. 下一个排列

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

  2. Leetcode--31. 下一个排列

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

  3. 20200217:下一个排列(leetcode31)

    下一个排列 题目 思路与算法 代码实现 题目 思路与算法 我直接说思路不直观,直接上个例子来说明更加直观. 字典序这个就是正常的字面意思,123,132,213,231,312,321,这个顺序 举个 ...

  4. LeetCode31.下一个排列 JavaScript

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

  5. 《LeetCode力扣练习》第31题 下一个排列 Java

    <LeetCode力扣练习>第31题 下一个排列 Java 一.资源 题目: 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列. 例如,arr = [1,2,3] ,以下这些都可 ...

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

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

  7. LeetCode 30串联所有单词的子串31下一个排列

    标题 串联所有单词得字串 下一个排列 维护真的不易,如有帮助还请点赞关注,关注公众号bigsai回复进群即可加入打卡. 串联所有单词得字串 题目描述: 给定一个字符串 s 和一些长度相同的单词 wor ...

  8. Leecode31. 下一个排列——Leecode大厂热题100道系列

    我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...

  9. 下一个排列Python解法

    整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列. 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3].[1,3,2].[3,1,2].[2,3,1] . ...

最新文章

  1. 算法每日练习之判断完数
  2. Android禁止ViewPager的左右滑动
  3. USACO - 3.1.6 - Stamps
  4. reentrantlock非公平锁不会随机挂起线程?_【原创】Java并发编程系列16 | 公平锁与非公平锁...
  5. IDEA打开父类的接口方法快捷键
  6. C# 多线程同步和线程通信
  7. mooc中的习题--然后是几点
  8. 系统学习深度学习(八)--损失函数
  9. 凸优化第四章凸优化问题 4.1 优化问题
  10. java 高级查询插件_javascript高级组合查询控件(0.4更新)
  11. ecno是什么的缩写_美国的英文缩写是什么简写
  12. 一种可调电子负载电路/可调恒流源电路
  13. 工厂都离不开的“人机料法环”
  14. Uipath的下载与使用教程
  15. 拉肚子差评回复模板_女子吃外卖烧烤后拉肚子给差评,老板电话骂人后还说“欧耶”...
  16. HTML上标和下标原理,HTML标签:上标、下标
  17. word文件限制编辑如何解除
  18. HBase:项目之电信信号强度诊断介绍(第一阶段:了解整个项目相关信息)
  19. PC与三菱PLC 485BD模块 无协议通讯模式
  20. 概率算法c++语言,计算结果总和的概率的算法

热门文章

  1. 进入环境_如何进入Windows恢复环境(WinRE)
  2. Using libcurl in VC++
  3. python IDLE中反斜杠显示为人民币符号¥的解决办法
  4. 几种简单的排序算法(JAVA)
  5. java(eclipse)和数据库(mysql)的连接
  6. HTML data属性简介以及低版本浏览器兼容算法
  7. Knockoutjs 实践入门 (2) 绑定事件
  8. C#线程通信与异步委托
  9. [LeetCode] Remove Duplicates from Sorted List - 链表问题
  10. iOS之深入解析Block的底层原理