LeetCode刷題筆記 31 下乙個排列

2021-09-23 13:37:26 字數 1061 閱讀 2822

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

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

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

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

[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[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] 之後的數字,以獲得下乙個最小的字典排列。

class

solution

//將後面的陣列變為公升序排序

i++;int j = nums.length-1;

while

(i < j)

swap

(nums, i++

, j--);

}private

void

swap

(int

nums,

int i,

int j)

}

LeetCode刷題筆記 31下乙個排列

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。示例 輸入 輸出 1,2,3 1,3,2 3,2,1 1,2,3 1,1,5 1,5,1 舉乙個具體的例...

Leetcode刷題筆記

1.兩數之和給定乙個整數陣列nums 和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。ps 你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。思路 用target減去nums中的每乙個數,並設立乙個字典來記錄對應的下標 class...

LeetCode刷題筆記

實現strstr 給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。示例 1 輸入 haystack hello needle ll 輸出 2 示例 2 輸入 haystack aaaa...