LeetCode 31 下乙個排列

2021-09-28 22:48:43 字數 1380 閱讀 2494

題目描述:

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

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

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

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

1,2

,3 → 1,3

,23,

2,1 → 1,2

,31,

1,5 → 1,5

,1

演算法

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

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

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

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

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...