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...