題目描述:實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
思路:乍一看題目感覺挺複雜的,直接求下乙個排列好像一下子沒什麼思路。所以從最簡單的情況入手——數列只有兩個數。此時,若第乙個數大於第二個,則屬於不存在下乙個更大的排列的情況,直接輸出最小排列即可;反之,則應當互動這兩個數。事實上,對於任意的數列,只要最後兩個數是正序排列的,那麼交換最後兩個數即可。假設數列nums=。將numsmin(也就是最後的兩個數)作為最小數列,將numscurrent=稱為當前數列。則有以下流程:(流程圖畫的有點粗糙。。。)
需要注意的是虛線框裡的部分,根據前面的條件,此時的numscurrent中am+1大於am且大於am+1後面的數。這樣其實可以分為三種情況繼續討論,這裡就不多贅述了。這三種情況對應的做法可以統一成一種做法,也就是虛線框裡寫的。多提一嘴,這種情況下,am+1及其後面的數字必然是降序排列的,在程式設計的時候利用這種特性可以更加高效。
public
void
nextpermutation
(int
nums)
} array.
reverse
(nums);}
}public
static
void
exchange
(ref
int[
] nums,
int a,
int b)
public
static
int[
]quick_sort
(ref
int[
] list,
int left,
int right)
return list;
}private
static
intget_partition
(ref
int[
] list,
int left,
int right)
list[left]
= list[right]
;while
(left < right && list[left]
<= tmp)
list[right]
= list[left];}
list[right]
= tmp;
return right;
}
**裡的quick_sort()函式是快排。實際上從大到小排列可以不用快排而是對目標數列進行反轉,不過懶得改了。。 LeetCode 31 下乙個排列 中等
31.下乙個排列 中等 實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。示例 1 輸入 nums 1,2,3 輸出 1,3,2 示例 2 輸入 nums...
Leetcode題目31 下乙個排列(中等)
題目描述 實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,...
LeetCode 下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...