题目描述:实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将其重新排列成最小的排序(即按升序排列)。
注意:必须原地修改,只能使用额外的常数空间
示例 :
一 : 1,2,3 -> 1,3,2
二 : 3,2,1 -> 1,2,3
三 : 1,1,5 -> 1,5,1
实话说这题背后的数学原理我还没弄懂,这里先记录一下。看解答是说这个问题有个标准算法,流程如下:
- 首先从左向右遍历,找到最大索引 i 使得 nums[i] < nums[i+1]
- 然后从右向左遍历,找到第一个索引 k 使得 nums[k] > nums[i]
- nums[i], nums[k] = nums[k], nums[i]
- 反转 nums[i+1:]
def nextPermutation(nums):
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
loc = -1
for i in range(n-1):
if nums[i+1] > nums[i]:
loc = i
if loc == -1:
nums.sort()
else:
j = n-1
while j > loc:
if nums[j] > nums[loc]:
nums[loc], nums[j] = nums[j], nums[loc]
break
j -= 1
p, q = loc+1, n-1
while p < q:
nums[p], nums[q] = nums[q], nums[p]
p += 1
q -= 1