[LeetCode31. 下一個排列——雙指標
阿新 • • 發佈:2020-12-11
技術標籤:leetcode列表演算法leetcodepython
LeetCode31. 下一個排列
Difficulty: 中等
實現獲取下一個排列的函式,演算法需要將給定數字序列重新排列成字典序中下一個更大的排列。
如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
必須原地修改,只允許使用額外常數空間。
示例 1:
輸入:nums = [1,2,3]
輸出:[1,3,2]
示例 2:
輸入:nums = [3,2,1]
輸出:[1,2,3]
示例 3:
輸入:nums = [1,1,5]
輸出:[1,5,1]
示例 4:
輸入:nums = [1]
輸出:[ 1]
Solution
分三個步驟
- 從後往前找到第一個不是降序的下標
- 倒著找到第一個比它大的,交換
- 反轉後邊列表(因為後邊就是降序,反過來就完了。如果遇到整個列表降序的情況,全部倒過來就完了)
class Solution(object):
def nextPermutation(self, nums):
"""
:type nums: List[int]
:rtype: None Do not return anything, modify nums in-place instead.
"""
p=-1
q=-1
#步驟1:從後往前找到第一個不是降序的下標
for i in range(len(nums)-2,-1,-1):
if nums[i]<nums[i+1]:
p=i
break
#步驟2:倒著找到第一個比它大的,交換
if p!=-1:
for i in range(p,len(nums)):
if nums[p]<nums[ i]:
q=i
nums[p],nums[q]=nums[q],nums[p]
#原來使用 nums=nums[:p+1]+sorted(nums[p+1:]) 錯了,原因:必須原地修改!
l=p+1
r=len(nums)-1
while l<r:#步驟三:反轉後邊列表(因為後邊就是降序,反過來就完了
nums[l],nums[r]=nums[r],nums[l]
l+=1
r-=1
else:#步驟三(整個列表降序的情況)全部倒過來就完了
l=0
r=len(nums)-1
while l<r:
nums[l],nums[r]=nums[r],nums[l]
l+=1
r-=1