LeetCode31 下乙個排列 雙指標

2021-10-11 19:14:30 字數 1911 閱讀 1080

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):

defnextpermutation

(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]

: p=i

break

#步驟2:倒著找到第乙個比它大的,交換

if p!=-1

:for i in

range

(p,len

(nums)):

if nums[p]

: 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

#步驟三:反轉後邊列表(因為後邊就是降序,反過來就完了

nums[l]

,nums[r]

=nums[r]

,nums[l]

l+=1 r-=

1else

:#步驟三(整個列表降序的情況)全部倒過來就完了

l=0 r=

len(nums)-1

while l

nums[l]

,nums[r]

=nums[r]

,nums[l]

l+=1 r-=

1

leetcode 31 下乙個排列

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...

leetCode 31 下乙個排列

思路就是找到可以變大的最低位,進一步說,就是找到,nums pos 滿足,存在q使得,q pos 且 nums pos nums q 同時要注意的是,最終的答案要取q的下界。這是因為要找剛剛好比所給數字大的數字,所以我們要使得pos位,增大的盡量小。class solution else if nu...

LeetCode31 下乙個排列

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...