Leecode31. 下一个排列——Leecode大厂热题100道系列
我是小張同學,立志用最簡潔的代碼做最高效的表達
以下是我個人做的題解,每個題都盡量囊括了所有解法,并做到了最優解,歡迎大家收藏!留言!
傳送門——>Leecode大廠熱題100道系列題解
問題描述
實現獲取 下一個排列 的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列(即,組合出下一個更大的整數)。
如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
必須 原地 修改,只允許使用額外常數空間。
示例 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]
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 100
思路
這道題是根據 維基百科 ,下圖所示:
翻譯過來:
- 先找出最大的索引kkk滿足nums[k]<nums[k+1]nums[k] < nums[k+1]nums[k]<nums[k+1],如果不存在,就翻轉整個數組;
- 再找出另一個最大索引lll滿足nums[l]>nums[k]nums[l] > nums[k]nums[l]>nums[k];
- 交換nums[l]nums[l]nums[l]和nums[k]nums[k]nums[k];
- 最后翻轉nums[k+1:]nums[k+1:]nums[k+1:]。
舉個例子:
比如nums=[1,2,7,4,3,1]nums = [1,2,7,4,3,1]nums=[1,2,7,4,3,1],下一個排列是什么?
我們找到第一個最大索引是nums[1]=2nums[1] = 2nums[1]=2
再找到第二個最大索引是nums[4]=3nums[4] = 3nums[4]=3
交換,nums=[1,3,7,4,2,1]nums = [1,3,7,4,2,1]nums=[1,3,7,4,2,1];
翻轉,nums=[1,3,1,2,4,7]nums = [1,3,1,2,4,7]nums=[1,3,1,2,4,7]
完畢!
所以,
時間復雜度:O(n)O(n)O(n)
空間復雜度:O(1)O(1)O(1)
class Solution { public:void nextPermutation(vector<int>& nums) {bool flag = true;int len = nums.size();if(len == 1) return; // 特判int p = len - 2;while(p >= 0) {if(nums[p] < nums[p + 1]) {flag = false;for(int i = len-1; i > p; i--) {if(nums[i] > nums[p]) {swap(nums[p], nums[i]);reverse(nums.begin() + p + 1, nums.end());goto loop;}}}p--;}loop:;if(flag) reverse(nums.begin(), nums.end());return;} };總結
以上是生活随笔為你收集整理的Leecode31. 下一个排列——Leecode大厂热题100道系列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leecode22. 括号生成——Lee
- 下一篇: 乐观锁和悲观锁的使用场景及应用——Jav