31. Next Permutation
60. Permutation Sequence
Q60 里提到的题,根据当前 permutation 来 in-place 做出下一个。做这个需要理解好 permutation 排序的性质:
整个 ascending 的是最小的 permutation,最大的整个 descending,vice versa
permutation 中的子序列,也符合上一条性质,即整体 ascending 的子序列也已经是这个长度和元素构成下最小的。
具体解法见 https://leetcode.com/articles/next-permutation/,其实讲起来也很没意思,感觉没在考算法,在考 permutation 性质。
常规 straight forward 方法有一步是 reverse list slice, 在 python 里面写起来还挺 tricky,利用stack 的话可以规避这个操作,两份 code 都附着了。
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
i = len(nums)-1
while i > 0:
if nums[i-1] >= nums[i]:
i -= 1
else:
pivot = i
while pivot < len(nums)-1:
if nums[pivot+1] <= nums[i-1]: break
pivot += 1
nums[i-1], nums[pivot] = nums[pivot], nums[i-1]
nums[i:] = nums[i:][::-1] # 倒转list切片,这个值得记忆一下...
break
if i == 0:
nums.reverse()
Last updated
Was this helpful?