如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1
思路如下:
假設有陣列[1,5,4,7,6,3,2]
首先,觀察到7,6,3,2這部分,已經是降序排列的了,再往前看一位是4,既4,7,6,3,2,這一部分是可以重新排序變為新的數比原來的4,7,6,3,2要大的。
其次,那麼如何重新排4,7,6,3,2呢?很明顯,需要交換的兩個數,乙個是4,另乙個要比4大,這是顯而易見的,另乙個可以是7嗎?顯然不行,因為如果4、7交換,那就是7,4,6,3,2,而這個數很明顯不符合下乙個更大的排列的題意,因此只能是比7小的6,為什麼呢?因為6的再下乙個數是3,很明顯4與3不能交換,否則數字就越來越小了,因此取另乙個數的標準就是該數的下乙個數不會再比4大(也不能等於)。
最後,交換了4與6,得到6,7,4,3,2,這符合題意了嗎,還是沒有,因為6,7,4,3,2並不是下乙個更大的數,因為例如6,7,4,2,3都比它要小,因此還需要進行處理。如何處理6,7,4,3,2呢?很明顯,高位的數越小越好,這樣能保證得到的數越靠近6,7,4,3,2且又比6,7,4,3,2要大,因此要重新公升序排列7,4,3,2(6不動),即可得出結果。
class
solution
//從右往左找到第i個數,這個數比第i+1個數要小
int i=nums.length-2;
while
(i>=
0&&nums[i+1]
<=nums[i]
)//從陣列最後開始遍歷,找到乙個j,使得第j個數第一次比第i個數要大
if(i>=0)
//i、j位兩數交換
int temp1=nums[i]
; nums[i]
=nums[j]
; nums[j]
=temp1;
}//新的第i個數之後(不包括第i個數)公升序排列
int m = i+
1, n = nums.length -1;
while
(m < n)
}}
LeeCode刷題筆記
本來想在leecode題目頁面上做注釋的,結果沒找到位置,只好來這裡了 字串部分 14.最長公共字首 編寫乙個函式來查詢字串陣列中的最長公共字首。示例 1 輸入 flower flow flight 輸出 fl 自己做法 取第乙個string first,然後比較後面每個string的第 i 個元素...
LeetCode刷題筆記 31 下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。首先,我們觀察到對於任何給定序列的降序,沒有可能的下乙個更大的排列。9,5,4,3,1 我們需要從右邊找...
LeetCode刷題筆記 31下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。示例 輸入 輸出 1,2,3 1,3,2 3,2,1 1,2,3 1,1,5 1,5,1 舉乙個具體的例...