实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
解题思路:
4,6,5,3,2,1
对于上面这个例子来说,我们需要从右往左,找到第一个非升序的数字,也就是nums[i-1]<nums[i],得到i-1。这个例子是4所在的位置:0。如果没有找到非升序的数字,那就说明这是个全降序的数组,比如[3,2,1],这种直接返回反序数组就可以了。然后再次从右往左遍历,找到第一个大于4的数字,这里是5,然后把4和5换位置,变成5,6,4,3,2,1。然而这还不是结果,对于5以后的数字,需要从小到大排列。也就是5,1,2,3,4,6。这就是这个例子的答案了。
代码如下:
def nextPermutation(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
down = 0
flag = 0
for i in range(len(nums) - 1, 0, -1):
if nums[i - 1] < nums[i]:
down = i - 1
flag = 1
break
if not flag:
nums.reverse()
return
for i in range(len(nums) - 1, 0, -1):
if nums[i] > nums[down]:
nums[i], nums[down] = nums[down], nums[i]
last = nums[down + 1:]
last.reverse()
nums[down + 1:] = last
return
网友评论