31 下乙個排列

2021-09-26 07:08:23 字數 1608 閱讀 3275

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。

如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。

必須原地修改,只允許使用額外常數空間。

以下是一些例子,輸入位於左側列,其相應輸出位於右側列。

1,2,31,3,2

3,2,11,2,3

1,1,51,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...