题目简介:
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1 | 1,2,3 → 1,3,2 |
思路:
这题看了题解以后感觉还是有点懵懵的,像是脑筋急转弯题一样,下面是个人的一点理解。
首先是从后往前遍历,找到第一个破坏升序的元素位置pos
(即nums[pos ... ]
为降序数组),由于降序是最大的序列,所以我们先将后面降序的数组翻转,这样就变成了最小的升序数组了。
来个例子会更加清楚一点,如[5,7,6,4,3] -> [6,3,4,5,7]
,由于原数组是5
开头的最大数组了,所以下一个排列必是6
开头的,并且6
后面的数组必是最小的升序。
所以我们先将nums[pos ...]
翻转,变成[5,3,4,6,7]
,然后在升序数组[3,4,6,7]
中找到第一个比5
的数字6
(同样也是最接近5
的数),将其与5
交换,从而变成了[6,3,4,5,7]
,可以注意到,交换以后,原来是升序的数组现在还是升序的,说明这就是最小的组合了。
tip:
pos == 0
时,说明原本数组是最大的排列,下一个排列只需将其翻转,就是最小的升序了。
代码如下:
1 | class Solution { |