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 }
  • 相关阅读:
    浅谈ASP.NET核心对象
    SQL MID() 函数
    如何查看linux系统CPU利用率 简单
    canvas 学习笔记 简单
    linux 为用户设定、修改密码 passwd 简单
    转crontab用法(例子) 简单
    mongodb加入系统服务 简单
    转导出csv文件时,处理分隔符问题 简单
    tar和gzip、unzip命令详解 简单
    linux创建用户命令 简单
  • 原文地址:https://www.cnblogs.com/chkkch/p/2748910.html
Copyright © 2011-2022 走看看