[LEETCODE31] 下一個排列 - 數學
阿新 • • 發佈:2020-12-13
[LEETCODE31] 下一個排列
Description
實現獲取 下一個排列 的函式,演算法需要將給定數字序列重新排列成字典序中下一個更大的排列。
Solution
思路上,我們希望靠左的數儘可能不動,只在靠右的一些數間進行修改。
我們找到最大的滿足 \(a[i]<a[i+1]\) 的 \(i\),找到最大的滿足 \(a[j]>a[i]\) 的 \(j\),交換 \(a[i],a[j]\),此時 \(a[i+1..n]\) 仍然是降序的,我們需要反轉它來將其變為升序。
class Solution { public: void nextPermutation(vector<int>& nums) { int n=nums.size(); vector<int>& a=nums; int i=-1; for(i=n-2;i>=0;--i) if(a[i]<a[i+1]) break; if(i==-1) { for(int i=0;i<n;i++) for(int j=0;j<i;j++) if(a[i]<a[j]) swap(a[i],a[j]); } else { int j=n; for(j=n-1;j>i;j--) if(a[j]>a[i]) break; swap(a[i],a[j]); reverse(a.begin()+i+1,a.end()); } } };