題目
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。
如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須原地修改,只允許使用額外常數空間。
字典序
字典序,就是將元素按照字典的順序(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...