LeetCode31下乙個排列 思維

2021-10-14 16:48:17 字數 912 閱讀 1352

第一次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...