陣列降序排列 31 下乙個排列(難度 中等)

2021-10-14 19:58:43 字數 1601 閱讀 8098

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。

如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。

必須原地修改,只允許使用額外常數空間。

以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,31,3,23,2,11,2,31,1,51,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...