zoukankan      html  css  js  c++  java
  • LeetCode Permutations (全排列)

    题意:

      给出n个元素,请产生出所有的全排列。

    思路:

      注意到可能会有相同的排列出现,比如 {2,2}。还有可能是乱序列(大部分情况下都是无所谓的)。

      递归(1):产生的过多的多余vector。

     1 class Solution {
     2 public:
     3     void recursion(vector<int> num, int i,  vector<vector<int> > &res) 
     4     {
     5         if (i+1==num.size())    res.push_back(num);
     6         else
     7         {
     8             for (int j=i; j<num.size(); j++)
     9             {
    10                 if(j!=i&&num[i]==num[j])    continue;    
    11                 swap(num[i], num[j]);
    12                 recursion(num, i+1, res);
    13             }
    14         }
    15     }
    16     vector<vector<int> > permute(vector<int> &num) 
    17     {
    18         vector<vector<int> >res;
    19         recursion(num, 0, res);
    20         return res;
    21     }
    22 };
    AC代码

       递归(2):只要保证每次交换后都能换回来,必定能恢复到原来的样子,所以不需要产生过多的多余vector。

     1 class Solution {
     2     vector<vector<int> > ans;     
     3 public:
     4 
     5     void DFS(vector<int>& num,int pos)
     6     {
     7         if(pos+1==num.size())    ans.push_back(num);
     8         else
     9         {
    10             for(int i=pos; i<num.size(); i++)
    11             {
    12                 swap(num[i],num[pos]);
    13                 DFS(num,pos+1);
    14             swap(num[i],num[pos]);//换回来
    15             }
    16         }
    17     }
    18 
    19     vector<vector<int> > permute(vector<int> &num)
    20     {
    21         if(!num.empty())    DFS(num,0);
    22         return ans;
    23     }
    24 };
    AC代码

      迭代法:类似于BFS,由于不会有重复的数字,所以一个个数来分配。当分配一个数时,只要其前面不会有相同的数,就可以插入到末尾。速度也慢了很多。

     1 class Solution {
     2     deque<vector<int> > que;    
     3 public:
     4 
     5     bool isok(vector<int>& num,int a)
     6     {
     7         for(int i=0; i+1<num.size(); i++)
     8             if(num[i]==a)    return false;
     9         return true;
    10     }
    11 
    12 
    13     vector<vector<int> > permute(vector<int> &num)
    14     {
    15         que.push_back(vector<int>());
    16         for(int i=0; i<num.size(); i++)
    17         {
    18             int siz=que.size();
    19             for(int j=0; j<siz; j++)
    20             {
    21                 vector<int> tmp(que.front());
    22                 que.pop_front();
    23                 tmp.push_back(0);
    24                 for(int k=0; k<num.size(); k++)
    25                 {
    26                     if(isok(tmp,num[k]))
    27                     {
    28                         tmp[i]=num[k];
    29                         que.push_back(tmp);
    30                     }
    31                 }
    32             }
    33         }
    34         return vector<vector<int> >(que.begin(),que.end());
    35     }
    36 };
    AC代码
  • 相关阅读:
    Windows 7 SP1无人值守自动应答文件制作
    Ubuntu GNOME单击任务栏图标最小化设置
    NOIP2017题解
    NOIP2017游记
    大模拟1.0
    奇袭
    礼物
    找硬币
    Fiolki
    SQLserver Delete from where 与Oracle delete from where 的差异
  • 原文地址:https://www.cnblogs.com/xcw0754/p/4931626.html
Copyright © 2011-2022 走看看