31. 下一個排列
實現獲取下一個排列的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列。如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
解題思路
1.從右至左遍歷·nums,發現第一個小於右邊的數nums[i],將該nums[i]之後的數排升序;2.第二層遍歷nums[(i+1):],發現第一個大於nums[i]的數nums[j],交換兩數,退出遍歷break;3.交換了也排好序了,退出第一次層遍歷return nums
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
#i 代表從nums結尾往前遞增序列的頭, j代表遞增序列裏比nums[i - 1]大的最小的元素
l = len(nums)
for i in range(l - 1, -1, -1):
if nums[i - 1] < nums[i]:# 找到了需要的 i
break
if i == 0: # 代表當前不存在下一個更大的序列,整體翻轉即可
nums[:] = nums[::-1]
return nums
for j in range(l - 1, i - 1, -1):
if nums[j] > nums[i - 1]: #找到了需要的 j
break
nums[i - 1], nums[j] = nums[j], nums[i - 1]
nums[i:] = nums[i:][::-1]