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 }
  • 相关阅读:
    Business Objects 基础
    常用的bw基础知识
    SAP BW传输请求操作步骤
    FI/CO 财务基础知识
    SAP财务常用数据源概览
    HANA 和 SAP NetWeaver BW
    Request.QueryString中文乱码
    完全备份类型
    SQL Server备份属于I/O密集型操作
    SQL Server 通过发布订阅 实现数据库同步
  • 原文地址:https://www.cnblogs.com/chkkch/p/2748910.html
Copyright © 2011-2022 走看看