LeetCode 下乙個排列

2021-09-21 06:47:58 字數 1804 閱讀 2581

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

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

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

以下是一些例子,輸入位於左側列,其相應輸出位於右側列。

1,2,31,3,2

3,2,11,2,3

1,1,51,5,1

首先,我們觀察到對於任何給定序列的降序,沒有可能的下乙個更大的排列。

[9, 5, 4, 3, 1]
我們需要從右邊找到第一對兩個連續的數字 a[i]a[i] 和 a[i-1]a[i−1],它們滿足 a[i]>a[i-1]a[i]>a[i−1]。現在,沒有對 a[i-1]a[i−1] 右側的重新排列可以建立更大的排列,因為該子陣列由數字按降序組成。因此,我們需要重新排列 a[i-1]a[i−1] 右邊的數字,包括它自己。

現在,什麼樣的重新排列將產生下乙個更大的數字?我們想要建立比當前更大的排列。因此,我們需要將數字 a[i-1]a[i−1] 替換為位於其右側區域的數字中比它更大的數字,例如 a[j]a[j]。

我們交換數字 a[i-1]a[i−1] 和 a[j]a[j]。我們現在在索引 i-1i−1 處有正確的數字。 但目前的排列仍然不是我們正在尋找的排列。我們需要通過僅使用 a[i-1]a[i−1]右邊的數字來形成最小的排列。 因此,我們需要放置那些按公升序排列的數字,以獲得最小的排列。

但是,請記住,在從右側掃瞄數字時,我們只是繼續遞減索引直到我們找到 a[i]a[i] 和 a[i-1]a[i−1] 這對數。其中,a[i] > a[i-1]a[i]>a[i−1]。因此,a[i-1]a[i−1] 右邊的所有數字都已按降序排序。此外,交換 a[i-1]a[i−1] 和 a[j]a[j] 並未改變該順序。因此,我們只需要反轉 a[i-1]a[i−1] 之後的數字,以獲得下乙個最小的字典排列。

下面的動畫將有助於你理解:

// 如果沒找到 就表示沒有下乙個排列 直接翻轉整個陣列

if(k < 0)

for(int i = 0; i < (size / 2); i++)

else

// 再把他們交換 交換4和5

int temp = nums[z];

nums[z] = nums[k-1];

nums[k-1] = temp;

//再把後面的數顛倒一下順序 即把7以後的數顛倒過來

for(int i = 0; i < ((size - k)/2); i++)}}

};借這個題也終於想通了之前的遍歷陣列下標

問題,雖然很簡單,但是也困惑了我很久,一直也沒有想著去解決。

比如遍歷全陣列

for(int i = 0; i < size; i++)

printf("%d", nums[i]);

只要保證從第乙個下標開始,遍歷n個就是正確的

for(int i = 0; i < size /2; i++)
又比如 對半遍歷,常用於翻轉陣列

同樣是 從第乙個下標開始, 對半就長度除以2,然後檢查好下標就ok,第乙個和最後乙個對調 也就是0和size-1。

下乙個排列 Leetcode

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...

leetcode 下乙個排列

題目 31.下乙個排列 實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3...

LeetCode 下乙個排列(31)

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...