LeetCode 31. Next Permutation
---恢复内容开始---
生成下一个全排列数组。
1 class Solution { 2 public: 3 4 void reverse(vector<int>& p,int n){ 5 int temp,s=p.size(); 6 for (int i=n;i<(s+n)/2;i++){ 7 temp=p[i];p[i]=p[s-i+n-1];p[s-1-i+n]=temp; 8 } 9 } 10 11 void nextPermutation(vector<int>& p) { 12 int n=p.size(),i,justLarger,njl,temp; 13 14 for (i=n-1;i>0;){ 15 if (p[i-1]>=p[i]) i--; 16 else break; 17 } 18 19 if (i==0){ 20 reverse(p,0); 21 return ; 22 } 23 24 justLarger=p[i];njl=i; 25 for (int j=i;j<=n-1;j++){ 26 if ((p[j]>p[i-1])&&(p[j]<=justLarger)) { 27 justLarger=p[j]; 28 njl=j; 29 } 30 } 31 temp=p[i-1];p[i-1]=p[njl];p[njl]=temp; 32 if (n>2) reverse(p,i); 33 34 } 35 };
多个循环归成一个。
1 class Solution { 2 public: 3 void nextPermutation(vector<int>& ns){ 4 5 for (int i = ns.size() - 2; i >= 0; --i) { 6 //cout << "i = " << i << endl; 7 if (ns[i] < ns[i+1]) { 8 for (int j = ns.size() - 1; j > i; --j) { 9 //cout << j << endl; 10 if (ns[j] > ns[i]) { 11 swap(ns[j], ns[i]); 12 reverse(ns.begin() + i + 1, ns.end()); 13 return; 14 }//if 15 }//for j 16 }//if 17 }//for i 18 19 reverse(ns.begin(), ns.end()); 20 return; 21 } 22 };
生成全排列。
伪代码:
void print——permutation(序列A,集合S){
if (S为空) 输出A;
else 按从小到大的顺序依次考虑S的每个元素v{
print_nextPermutation(在A末尾添加v得到新序列,S-[v]);
}
}