题目链接:

下一个排列 - 力扣(LeetCode)​leetcode-cn.com

题目描述:

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

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

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

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,31,3,23,2,11,2,31,1,51,5,1

解题思路:

最直接的想法是暴力法,找出由给定数组的元素形成的列表的每个可能的排列,并找出比给定的排列更大的排列。但是时间复杂度是

,因为可能的排列总计有
个,爆表了都,我们得想想有没有更快的算法。

首先,如果是一个降序数组,没有可能有下一个更大的排列,直接反转变成升序数组就好。

然后,我们再来看看一般情形,假设数组名为

,长度为
,这个数组中必然存在着
,使得
,我们对
以及其右边的数进行重新排列就可以得到一个比初始排列大的排列。

而要想找到下一个排列,我们可以从右往左来找到第一对满足

。接着,我们需要在
的右边发现一个
,使得
,且
在所有大于
的值中最小,我们交换
的位置。
来自 leetcode 官方题解

现在在索引

处有正确的数字。但目前的排列仍然不是答案,我们需要通过仅使用
右边的数字来形成最小的排列。 因此,我们需要放置那些按升序排列的数字,以获得最小的排列。

可能你想到直接排序就好了嘛,但其实还有更简单的方法。因为在从右侧扫描数字时,我们只是持续递减索引直到我们找到

这对数。其中,
右边的所有数字都已按降序排序。此外,交换
也并未改变该顺序。因此,我们只需要反转
之后的数字,就可以获得下一个最小的字典排列。

代码如下:

class Solution {public:void nextPermutation(vector<int>& nums) {int n = nums.size(), k, l;for (k = n - 2; k >= 0; k--) {if (nums[k] < nums[k + 1]) {break;}}if(k < 0) {reverse(nums.begin(), nums.end());}else {for (l = n - 1; l > k; l--) {if (nums[l] > nums[k]) {break;}}swap(nums[k], nums[l]);reverse(nums.begin()+k+1, nums.end());}}
};

其实 C++ 里面有库函数 next_permutation 可以直接帮我们获取下一个排列。。。

如果有任何疑问,欢迎提出。如果有更好的解法,也欢迎告知。

数组的合并和升序排列_leetcode No.31 下一个排列相关推荐

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

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

  2. 72.编辑距离105.前序中序遍历序列构造二叉树151.翻转字符串里的单词104.二叉树的最大深度76.最小覆盖子串110.平衡二叉树31.下一个排列

    72.编辑距离 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 .你可以对一个单词进行如下三种操作:插入一个字符,删除一个字符,替换一个字符. ...

  3. LeetCode每日一题--31. 下一个排列(数学)

    题目:跳转至 31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原 ...

  4. 【LeetCode】【HOT】31. 下一个排列

    [LeetCode][HOT]31. 下一个排列 文章目录 [LeetCode][HOT]31. 下一个排列 package hot;import java.util.Arrays;public cl ...

  5. LeetCode 热题 HOT 100 -------31. 下一个排列(数组,数学问题)128. 最长连续序列(数组) 11. 盛最多水的容器(数组) 621. 任务调度器 (数组)

    dsadas /**思路:找下一个排列,并且尽可能小,所以我们应该找一序列中从左边开始的"较小值"与"较大值"交换,但是为了尽可能小应该满足: 1." ...

  6. LeetCode.31 下一个排列

    题目描述 实现获取下一个排列的算法,算法需要将给定的数组,重新排列成下一个更大的排列(即组合出下一个更大的数字). 如果不存在下一个更大的排列,则将数字重新排列成最小的排列. 题目思路 我们可以使用如 ...

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

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

  8. LeetCode 31. 下一个排列 Next Permutation

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

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

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

最新文章

  1. Python,OpenCV使用KNN来构建手写数字及字母识别OCR
  2. 报名 | 三年拿斯坦福CS博士的创业者:AI如何赋能金融
  3. 用 JS 做一个数独游戏(二)
  4. msm8953+android8.1接听电话时声音由默认听筒输出改为外放输出
  5. UA MATH564 概率分布总结
  6. 【洛谷 P4934】 礼物 (位运算+DP)
  7. 以女朋友为例讲解 TCP/IP 三次握手与四次挥手
  8. ASP VBScript 函数速查表
  9. Spark将数据写入Mysql
  10. 力扣-202 快乐数
  11. 关于限制水晶报表的导出格式
  12. ps--光照+光晕+模糊
  13. (开源)带有笔顺的字体
  14. 阿里云物联网配置网络流程
  15. SpringMVC----ajax跨域请求
  16. OKR使用什么工具落地?
  17. 如何使用BBP公式直接计算π的第n位
  18. unity之Matrix4x4.TRS(Vector3 pos, Quaternion q, Vector3 s)的原理
  19. 学习成长之路 (初章 三个月建成微信 小程序商城、ArcEngine C# GIS开发入门)
  20. Python王者荣耀皮肤批量下载

热门文章

  1. 穷人最缺少的是什么?
  2. DM入门之Apriori小结
  3. oracle已经有了注释符再注释,关于oracle的注释位置
  4. jquery调用WCF
  5. string容量JAVA_java的StringBuilder类的长度和容量有什么区别呢?
  6. 3399 mysql_手动安装 mysql
  7. vue的watch监听
  8. 1018 锤子剪刀布 (20分)
  9. 关于ubuntu终端命令路径太长的问题
  10. 【软件开发底层知识修炼】十四 快速学习GDB调试一 入门使用