實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。
如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3
→1,3,2
3,2,1
→1,2,3
1,1,5
→1,5,1
【中等】
【分析】乍一眼還真沒看懂這道題是什麼意思…
其實舉個栗子,給定數字,給定這些數字序列的乙個排列:
1,5,3,7,9,8
.題目要求給出比上面給定的排列大一點的排列(意思就是說比它大的排列,並且是比它大的排列中的最小排列),就是1,5,7,3,8,9
。
這道題真的覺得很奇怪,測試是正確的,結果放在平台上總是錯的。不管了,簡述一下思路吧。。。。
以逆序遍歷right
,以nums=[1,1,5,3,6,4,1,0]
為例:
具體的例子變化如下:
nums=[1,1,5,3,6,4,1,0] → nums[1,1,5,4,6,3,1,0], right=4 → nums=[1,1,5,4,0,1,3,6]
class solution(object):
def nextpermutation(self, nums):
""":type nums: list[int]
:rtype: none do not return anything, modify nums in-place instead.
"""if len(nums)>1:
flag=0 #例 nums=[1,1,5,3,6,4,1,0]
for right in range(len(nums)-1,0,-1):
if nums[right-1]right-1:
if nums[right-1]nums[right-1],nums[tmp_max]=nums[tmp_max],nums[right-1]
break
tmp_max-=1
# 例 nums=[1,1,5,4,6,3,1,0] ,right=4
##將right-1後面的數按從小到大排序
k=1while k<=(len(nums)-right)/2:
nums[right+k-1],nums[len(nums)-k]=nums[len(nums)-k],nums[right+k-1]
k+=1
#例 nums=[1,1,5,4,0,1,3,6]
break
if not flag:
nums=nums[::-1]
31 下乙個排列
public void nextpermutation int nums 從後向前找到第乙個不滿足逆序的元素 int i nums.length 2 for i 0 nums i nums i 1 i 注意,這裡有 可以排除含有重複元素的情況 從i 1位置開始,向後查詢比nums i 大的最小元素 ...
31 下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...
31 下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...