zoukankan      html  css  js  c++  java
  • 力扣算法题—046全排列

      1 #include "000库函数.h"
      2 
      3 
      4 //使用排序,感觉在作弊,但是题目没说不可以
      5 //24ms
      6 class solution {
      7 public:
      8     vector<vector<int>> permute(vector<int>& nums) {
      9         vector<vector<int>>res;
     10         if (nums.empty())return res;
     11         sort(nums.begin(), nums.end());//排序
     12         do {
     13             res.push_back(nums);                
     14         } while (next_permutation(nums.begin(), nums.end()));
     15         return res;
     16     }
     17 };
     18 
     19 //使用递归
     20 class Solution {
     21 public:
     22     vector<vector<int>> permute(vector<int>& nums) {
     23         vector<vector<int>>Res;
     24         if (nums.empty())return Res;
     25         Combin(Res, nums, 0);//回溯
     26         return Res;
     27     }
     28     void Combin(vector<vector<int>>&Res, vector<int>v, int s) {
     29         if (s >= v.size()) //此处不return,在for中结束后自动结束
     30             Res.push_back(v);
     31             
     32         for (int i = s; i < v.size(); ++i) {
     33             swap(v[s], v[i]);//交换
     34             Combin(Res, v, s + 1);//回溯
     35             swap(v[s], v[i]);//换回来
     36         }
     37     }
     38 
     39 };
     40 
     41 ////使用DFS递归
     42 class Solution {
     43 public:
     44     vector<vector<int>> permute(vector<int>& num) {
     45         vector<vector<int>> res;
     46         vector<int> out, visited(num.size(), 0);
     47         permuteDFS(num, 0, visited, out, res);
     48         return res;
     49     }
     50     void permuteDFS(vector<int>& num, int level, vector<int>& visited, vector<int>& out, vector<vector<int>>& res) {
     51         if (level == num.size()) { res.push_back(out); return; }//数字大小达到要求
     52         for (int i = 0; i < num.size(); ++i) {
     53             if (visited[i] == 1) continue;
     54             visited[i] = 1;//该数据已经选用
     55             out.push_back(num[i]);
     56             permuteDFS(num, level + 1, visited, out, res);
     57             out.pop_back();//回溯
     58             visited[i] = 0;
     59         }
     60     }
     61 };
     62 
     63 //当n = 1时,数组中只有一个数a1,其全排列只有一种,即为a1
     64 //
     65 //当n = 2时,数组中此时有a1a2,其全排列有两种,a1a2和a2a1,那么此时我们考虑和上面那种情况的关系,我们发现,其实就是在a1的前后两个位置分别加入了a2
     66 //
     67 //当n = 3时,数组中有a1a2a3,此时全排列有六种,分别为a1a2a3, a1a3a2, a2a1a3, a2a3a1, a3a1a2, 和 a3a2a1。那么根据上面的结论,实际上是在a1a2和a2a1的基础上在不同的位置上加入a3而得到的。
     68 //
     69 //_ a1 _ a2 _ : a3a1a2, a1a3a2, a1a2a3
     70 //
     71 //_ a2 _ a1 _ : a3a2a1, a2a3a1, a2a1a3
     72 class Solution {
     73 public:
     74     vector<vector<int>> permute(vector<int>& num) {
     75         vector<vector<int>> res;
     76         if (num.empty()) return res;        
     77         int first = num[0];
     78         num.erase(num.begin());//删除此数字
     79         vector<vector<int>> words = permute(num);
     80         for (auto &a : words) {
     81             for (int i = 0; i <= a.size(); ++i) {
     82                 a.insert(a.begin() + i, first);
     83                 res.push_back(a);
     84                 a.erase(a.begin() + i);
     85             }
     86         }
     87         return res;
     88     }
     89 };
     90 
     91 void T046() {
     92     vector<int>n;
     93     Solution s;
     94     n = { 1,2,3 };
     95     for (auto &a : s.permute(n)) {
     96         for (auto b : a)
     97             cout << b << "  ";
     98         cout << endl;
     99     }
    100 
    101 }
  • 相关阅读:
    使用SpringAOP获取一次请求流经方法的调用次数和调用耗时
    疫苗之殇与理性应对之道
    【做更好的职场人】理性、弹性、开放的沟通
    使用IntelljIDEA生成接口的类继承图及装饰器模式
    订单导出应对大流量订单导出时的设计问题
    预发和线上的自动化对比工具微框架
    从实战角度看如何构建高质量的软件:一线工程师的一份质量手记
    代码问题及对策
    若干设计经验教训小记
    输入输出无依赖型函数的GroovySpock单测模板的自动生成工具(上)
  • 原文地址:https://www.cnblogs.com/zzw1024/p/10609963.html
Copyright © 2011-2022 走看看