實現(xiàn)獲取下一個排列的函數(shù),算法需要將給定數(shù)字序列重新排列成字典序中下一個更大的排列署照。
如果不存在下一個更大的排列禽作,則將數(shù)字重新排列成最小的排列(即升序排列)。
必須原地修改岸裙,只允許使用額外常數(shù)空間猖败。
以下是一些例子,輸入位于左側(cè)列降允,其相應(yīng)輸出位于右側(cè)列恩闻。
1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
解題思路:
4,6,5,3,2,1
對于上面這個例子來說,我們需要從右往左剧董,找到第一個非升序的數(shù)字幢尚,也就是nums[i-1]<nums[i],得到i-1破停。這個例子是4所在的位置:0。如果沒有找到非升序的數(shù)字尉剩,那就說明這是個全降序的數(shù)組真慢,比如[3,2,1],這種直接返回反序數(shù)組就可以了理茎。然后再次從右往左遍歷黑界,找到第一個大于4的數(shù)字,這里是5功蜓,然后把4和5換位置园爷,變成5,6,4,3,2,1。然而這還不是結(jié)果式撼,對于5以后的數(shù)字童社,需要從小到大排列。也就是5,1,2,3,4,6著隆。這就是這個例子的答案了扰楼。
代碼如下:
def nextPermutation(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
down = 0
flag = 0
for i in range(len(nums) - 1, 0, -1):
if nums[i - 1] < nums[i]:
down = i - 1
flag = 1
break
if not flag:
nums.reverse()
return
for i in range(len(nums) - 1, 0, -1):
if nums[i] > nums[down]:
nums[i], nums[down] = nums[down], nums[i]
last = nums[down + 1:]
last.reverse()
nums[down + 1:] = last
return