LeetCode31.下一個排列
LeetCode31. 下一個排列
1.題目描述:
實現獲取 下一個排列 的函式,演算法需要將給定數字序列重新排列成字典序中下一個更大的排列。
如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
必須 原地 修改,只允許使用額外常數空間。
示例 1:
輸入:nums = [1,2,3]
輸出:[1,3,2]
示例 2:
輸入:nums = [3,2,1]
輸出:[1,2,3]
示例 3:
輸入:nums = [1,1,5]
輸出:[1,5,1]
示例 4:
輸入:nums = [1]
輸出:[1]
2.解題思路:
首先我們需要了解什麼是字典序:
對於數字1、2、3…n的排列,不同排列的先後關係是從左到右逐個比較對應的數字的先後來決定的。例如對於5個數字的排列 12354和12345,排列12345在前,排列12354在後。按照這樣的規定,5個數字的所有的排列中最前面的是12345,最後面的是 54321。
之後我們希望下一個數比當前數大,這樣才滿足“下一個排列”的定義。因此只需要將後面的 大數 與前面的 小數 交換,就能得到一個更大的數。比如 123456,將 5 和 6 交換就能得到一個更大的數 123465。
我們還希望下一個數增加的幅度儘可能的小,這樣才滿足“下一個排列與當前排列緊鄰“的要求。為了滿足這個要求,我們需要:在儘可能靠右的低位進行交換,需要從後向前查詢將一個 儘可能小的 大數 與前面的 小數 交換。比如 123465,下一個排列應該把 5 和 4 交換而不是把 6 和 4 交換
將 大數 換到前面後,需要將 大數 後面的所有數重置為升序,升序排列就是最小的排列。以 123465 為例:首先按照上一步,交換 5 和 4,得到 123564;然後需要將 5 之後的數重置為升序,得到 123546。顯然 123546 比 123564 更小,123546 就是 123465 的下一個排列
3.Python實現
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
i = len(nums) - 2
while i >= 0 and nums[i] >= nums[i + 1]:
i -= 1
if i >= 0:
j = len(nums) - 1
while j >= 0 and nums[i] >= nums[j]:
j -= 1
nums[i], nums[j] = nums[j], nums[i]
left, right = i + 1, len(nums) - 1
while left < right:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right -= 0
4.總結:
剛開始連題都讀不懂,知道啥是字典序之後又想了好久,在位置的交換上一直搞的迷迷瞪瞪的,後來才想清楚。
相關文章
- 31. 下一個排列
- 下一個排列(LeetCode)LeetCode
- [LeetCode] Next Permutation 下一個排列LeetCode
- LeetCode 31. 下一個排列 | PythonLeetCodePython
- 全排列及相關擴充套件演算法(二)——求字典序下一組排列及全排列演算法套件演算法
- 現在有"abcdefghijkl”12個字元,將其所有的排列中按字典序排列,給出任意一種排列,說出這個排列在所有的排列中是第幾小的?字元
- 實現將10個整數升序排列
- CSS下一個兄弟元素CSS
- 逆序排列
- css兩個div在同一行排列CSS
- 用js寫三個數,讓三個數從小到大排列JS
- JavaScript獲取下一個元素JavaScript
- AngularJS - 下一個大框架AngularJS框架
- 字串的排列字串
- 排列轉換
- 字串全排列字串
- 排列 題解
- 排列組合
- 淺析實現平鋪排列多個View的效果View
- CSS 緊鄰下一個兄弟元素CSS
- 小說+遊戲+影視=下一個熱點?遊戲
- 遊戲:下一個超級平臺遊戲
- 比特幣的下一個天堂比特幣
- linux 下一個替換命令Linux
- MySQL能否成下一個Oracle?(轉)MySqlOracle
- linux下一個網路卡配置多個IPLinux
- JavaScript字串逆序排列JavaScript字串
- [MATLAB]排列大小Matlab
- 生成隨機排列隨機
- 字串的全排列字串
- 《Cracking the Coding Interview程式設計師面試金典》----下一個元素(下一個比他大的)View程式設計師面試
- 實現一個炫酷的隨機標籤排列效果(顏色隨機,大小隨機,成菱形排列的列表)隨機
- windows 下一個程式能開多少個執行緒Windows執行緒
- 強烈建議出下一個版本
- JavaScript 獲取下一個元素節點JavaScript
- Google X ,下一個谷歌的誕生地Go谷歌
- 下一個AI舞臺,名叫煤礦AI
- 下一個十年:人工智慧人工智慧