[LeetCode]31 下一个排列

题目描述

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

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

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

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

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution:
def nextPermutation(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
flag = False
ver = -1 #from this index
print(len(nums))
for i in range(len(nums)-1,0,-1):
if nums[i-1]<nums[i]:
flag = True
ver = i-1
break
if ver==-1:
nums.reverse()
else:
ti = len(nums)
t=max(nums)+1
for i in range(len(nums)-1,ver,-1):
if nums[i]>nums[ver] and nums[i]<t:
ti=i
t=nums[ti]
print("ver,t,ti:",ver,t,ti)
nums[ti]=nums[ver]
nums[ver]=t
print(nums[ver+1:])
d = nums[ver+1:]
d.sort(reverse = False)
print(d)
for i,j in zip(range(ver+1,len(nums)),range(len(d))):
nums[i]=d[j]