zoukankan      html  css  js  c++  java
  • [面试] 全排列(非递归)

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

    模拟递归当然会想到用栈模拟,最主要的是考虑初始的压入栈中的值,这里首先想到递归调用是用一个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 }
  • 相关阅读:
    css实现自适应正方形
    遇到稍微复杂的场景发现css功力不足
    聊聊缓存
    git学习笔记
    font-size:0的作用
    移动端高清屏适配方案
    react生命周期
    javascript写定时器
    js判断字符串是否以某个字符串开头和js分解字符串
    json.parse()和json.stringify()
  • 原文地址:https://www.cnblogs.com/chkkch/p/2748910.html
Copyright © 2011-2022 走看看