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 };
AC代码

 

多个循环归成一个。

 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 };
View Code

 

生成全排列。

伪代码:

void print——permutation(序列A,集合S){

  if (S为空) 输出A;

  else 按从小到大的顺序依次考虑S的每个元素v{

    print_nextPermutation(在A末尾添加v得到新序列,S-[v]);

  }

}

posted @ 2019-01-07 15:48  Travelller  阅读(130)  评论(0编辑  收藏  举报