[面试] 全排列(非递归)

打印一个数组的全排列,要求非递归。

模拟递归当然会想到用栈模拟,最主要的是考虑初始的压入栈中的值,这里首先想到递归调用是用一个for循环遍历0到n-1的索引,看哪个可以用(比如k)就递归调用函数,然后返回的时候在k+1继续循环查找下去。这里的关键是如何能模拟循环的一个过程,于是我考虑到用出栈的值的下一个值来继续for循环的下一个值,于是初始从0开始,我们就可以先压入-1,然后再把它弹出栈,取下一个值作为for循环的初始值。然后当栈大小>n时打印。

 1 #include <iostream>
 2 #include <vector>
 3 #include <stack>
 4 using namespace std;
 5 
 6 void permutation(int a[], int n)
 7 {
 8     vector<int> b(n);
 9     vector<bool> canUse(n);
10 
11     for(int i = 0; i < n; i++)
12         canUse[i] = true;
13 
14     stack<int> s;
15 
16     s.push(-1);
17 
18     while(!s.empty())
19     {
20         if (s.size() > n)
21         {
22             for(int i = 0; i < n; i++)
23                 cout << b[i] << ' ';
24             cout << endl;
25             s.pop();
26             continue;
27         }
28 
29         if (s.top() >= 0)
30             canUse[s.top()] = true;
31 
32         int start = s.top() + 1;
33         s.pop();
34         for(int i = start; i < n; i++)
35             if (canUse[i])
36             {
37                 canUse[i] = false;
38                 b[s.size()] = a[i];
39                 s.push(i);
40                 s.push(-1);
41                 break;
42             }
43     }
44 }
45 
46 int main()
47 {
48     int a[] = {1, 2, 3};
49 
50     int aSize = sizeof(a) / sizeof(int);
51 
52     permutation(a, aSize);
53 }
原文地址:https://www.cnblogs.com/chkkch/p/2748910.html