Leetcode-31. 下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1 | 1,2,3 → 1,3,2 |
来源:力扣(LeetCode)
链接:31. Next Permutation
解题思路
因为还没有系统地学习过离散数学,看到这样的题目通常都是一脸茫然的,参考了wiki百科Permutation以及《离散数学及其应用》第七版P368~369上面的算法介绍, 按字典顺序生成下一个最大排列的算法如下:
- Find the largest index
ksuch thata[k] < a[k + 1]. If no such index exists, the permutation is the last permutation. - Find the largest index
lgreater thanksuch thata[k] < a[l]. - Swap the value of
a[k]with that ofa[l]. - Reverse the sequence from
a[k + 1]up to and including the final elementa[n].
再来看下面一个例子,有如下的一个数组
1 | 1 2 7 4 3 1 |
下一个排列为:
1 | 1 3 1 2 4 7 |
看看这个算法是如何做到的.
- 首先, 满足
a[k] < a[k + 1]的最后一对整数分别为a[2]=2和a[3]=7 - 而排在
a[2]右边且大于a[2]的最小整数是a[5]=3 - 交换
a[2]和a[5] - 然后将剩余的数字进行升序即可
知道了这个算法以后代码写起来应该就比较容易了,具体如下:
代码
1 | // 交换nums数组当中的两个元素 |