Leetcode 31. 下一個排列
阿新 • • 發佈:2018-12-09
實現獲取下一個排列的函式,演算法需要將給定數字序列重新排列成字典序中下一個更大的排列。
如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
看了網上的題解才懂得。。。現在再來梳理一下。。。
(1)找出nums[i]<nums[i-1]的情況。。。即找出第一個不符合降序排序的情況。。。
(2)從末尾元素開始查詢,找滿足第一個比nums[i]大的最小元素nums[j]。。。因為i後面都是降序排列的,所以直接從後面遍歷即可。。。
(3)交換nums[j]與nums[i],並將i+1後面的元素進行反轉。。。。
(4)若原序列符合降序排序的情況,則直接反轉序列。。。
程式碼如下:
class Solution { public: void nextPermutation(vector<int>& nums) { int Size=nums.size(); if(Size==1) return; for (int i=Size-2,j=Size-1;i>=0;i--,j--) { if(nums[i]<nums[j]) { int k=Size-1; while (nums[i]>=nums[k]) k--; swap(nums[i],nums[k]); reverse (nums.begin()+j,nums.end()); return; } } sort(nums.begin(),nums.end()); } };