第一次wa的樣例 1 3 2 輸出應該是2 1 3
演算法推導
如何得到這樣的排列順序?這是本文的重點。我們可以這樣來分析:
我們希望下乙個數比當前數大,這樣才滿足「下乙個排列」的定義。因此只需要將後面的「大數」與前面的「小數」交換,就能得到乙個更大的數。比如 123456,將 5 和 6 交換就能得到乙個更大的數 123465。
我們還希望下乙個數增加的幅度盡可能的小,這樣才滿足「下乙個排列與當前排列緊鄰「的要求。為了滿足這個要求,我們需要:
在盡可能靠右的低位進行交換,需要從後向前查詢
將乙個 盡可能小的「大數」 與前面的「小數」交換。比如 123465,下乙個排列應該把 5 和 4 交換而不是把 6 和 4 交換
將「大數」換到前面後,需要將「大數」後面的所有數重置為公升序,公升序排列就是最小的排列。以 123465 為例:首先按照上一步,交換 5 和 4,得到 123564;然後需要將 5 之後的數重置為公升序,得到 123546。顯然 123546 比 123564 更小,123546 就是 123465 的下乙個排列
以上就是求「下乙個排列」的分析過程。
演算法過程
1.從後往前遍歷陣列掃到nums[i-1]public
void
nextpermutation
(int
nums)
int temp;
if(i!=0)
temp=nums[j]
; nums[j]
=nums[i-1]
; nums[i-1]
=temp;
} j=len-1;
while(i}
leetcode 31 下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...
leetCode 31 下乙個排列
思路就是找到可以變大的最低位,進一步說,就是找到,nums pos 滿足,存在q使得,q pos 且 nums pos nums q 同時要注意的是,最終的答案要取q的下界。這是因為要找剛剛好比所給數字大的數字,所以我們要使得pos位,增大的盡量小。class solution else if nu...
LeetCode31 下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...