實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。
如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3
→1,3,2
3,2,1
→1,2,3
1,1,5
→1,5,1
我們可以將該問題形式化地描述為:給定若干個數字,將其組合為乙個整數。如何將這些數字重新排列,以得到下乙個更大的整數。如 123 下乙個更大的數為 132。如果沒有更大的整數,則輸出最小的整數。
(1)如果要找到乙個比目前數字大的數,一定是把乙個比較靠後位置的大數
和前面的乙個小數
進行了交換。
(2)如果要找到乙個下乙個排列
,那麼這個小數
的位置i
盡可能的靠後,那麼我們就需要從後往前找,找到這個盡可能小的小數
下標為i
後;
(3)再找個盡可能小的大數
,最終為了滿足條件,這個大數
也要盡可能靠後,所以我們也從後往前找,找到那個剛好比小數
大的大數
,大數
的下標為j
。
(4)交換後,這個數字就會比之前的數字大,但是還不是最佳的,我們上述得到的數字,從下標i
以後的數字(不包括i),一定是降序排列的,因為上述的推理,類似於氣泡排序,所以,我們只要把[i+1,len-1]
,即下標i以後的陣列進行倒置,變成公升序,就是最後的結果了。
(1)從後往前找,找到第乙個公升序的元素[i,i+1]
,滿足nums[i](2)從後往前找,找到第乙個大於元素nums[i]
的下標k
,即滿足nums[i](3)將nums[i]
和nums[j]
進行交換
(4)再將下標為[i+1,len-1]
進行倒置,即將i+1
往後的元素進行倒置。
(5)如果沒有找到那個小數
,那麼說明目前的數字是最大的,那麼我們就需要返回最小數,即將整個陣列倒置,即進行第(4)步。
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...