Leetcode 31 Next Permutation
阿新 • • 發佈:2020-10-25
題目介紹
找到給定陣列的字典序的下一個排列,如果不存在,應當返回最小的排列。要求原地替換數字,使用常數空間的記憶體。
Example
:
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
Solution
這題沒有想到好的辦法,看了大神的解法,記錄一下這種演算法。
步驟如下:
- 從右至左,查詢第一個
nums[k]<nums[k+1]
的位置,即k
右邊的子序列單調不增; - 如果不存在,說明整個序列單調不增,返回排完序的整個陣列;
- 再次從右至左,找到第一個比
nums[k]
更大的位置l
,並且執行交換swap(nums[k], nums[l])
; - 然後再將
k
右邊的序列按升序排列
class Solution(object): def nextPermutation(self, nums): """ :type nums: List[int] :rtype: None Do not return anything, modify nums in-place instead. """ i = len(nums)-2 while i >= 0: if nums[i] < nums[i+1]: break i -= 1 if i < 0: nums[:] = nums[::-1] else: for j in range(len(nums)-1, i-1, -1): if nums[j] > nums[i]: nums[j], nums[i] = nums[i], nums[j] break nums[i+1:] = nums[-1:i:-1]