31 下乙個排列

2021-09-21 18:34:54 字數 1724 閱讀 3803

題目

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

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

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

字典序

字典序,就是將元素按照字典的順序(a-z, 1-9)進行排列。以字典的順序作為比較的依據,可以比較出兩個串的大小。比如 「12345」 < 「12354」<「12435」<「12453」, 就是按每個數字位逐個比較的結果。字典序法要求這乙個與下乙個有盡可能長的共同字首,也即變化限制在盡可能短的字尾上。

12354 與 12435

1 == 1

2 == 2

3 < 4

生成下乙個排列

從右向左,找到第乙個違反公升序的,叫他『partitionnumber』。

從右向左,找到第乙個比剛才那個數大的數,叫他『changenumber』。

交換著兩個數,然後把在partitionnumber右邊的數順序反過來。

演算法正確性證明

例1

2 4 3 1

3 1 是倒序排列,4 3 1 是倒序排列,2 4 3 1不是倒序排列,且2 4 3 1是2分支中的最後乙個排列,因此下乙個排列 肯定要換成乙個比2更大的數的分支中的第乙個排列,即換成 4 3 1中大於2的數中的最小的數 3,變為 3 4 2 1,此時 4 2 1為倒序,也就是說 3 4 2 1是3分支中的最後乙個排列,第乙個排列即是 順序排列 4 2 1,最終為 3 1 2 4

例2

3 2 4 1

3分支下的2分支下的最後乙個排列 變為 3分支下的4分支下的第乙個排列

3 4 1 2

class

solution

:def

nextpermutation

(self, nums: list[

int])-

>

none

:"""

do not return anything, modify nums in-place instead.

"""n =

len(nums)

partition = n

for i in

range

(n-1,0

,-1)

:if nums[i]

> nums[i -1]

: partition = i -

1break

if partition == n:

nums.reverse(

)return

for j in

range

(n-1

, partition,-1

):if nums[j]

> nums[partition]

: nums[partition]

, nums[j]

= nums[j]

, nums[partition]

break

nums[partition+

1:n]

= nums[partition+

1:n][:

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