46ZPermutations

给定一个整数数组集合, 返回所有的数组排列可能
my solution (16ms)
如果单纯想要做出来, 很简单, 递归就完事了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
   | static const int _ = []() {     std::ios::sync_with_stdio(false);     std::cin.tie(NULL);
      return 0; }();
  class Solution { public:     vector<vector<int>> permute(vector<int>& v) {         size_t size = v.size();          if (size == 1) return {v};         else if (size == 0) return {};
                   for (int i = 0; i < size; ++i) {             vector<int> temp = v;             temp.erase(temp.begin() + i);
              permute_do({v[i]}, temp);         }
          return ret;     }
  private:     void permute_do(vector<int> curv, vector<int> v) {         size_t size = v.size();
          if (size == 1) {             ret.push_back(curv);             ret.back().push_back(v.front());
              return;         }
          for (int i = 0; i < size; ++i) {             vector<int> tempV = v;             tempV.erase(tempV.begin() + i);             vector<int> tempCurv = curv;             tempCurv.push_back(v[i]);
              permute_do(tempCurv, tempV);         }     }
  private:     vector<vector<int>> ret; };
  | 
 
内存使用率应该很高, 因为每一次递归都会重新创建临时对象  
但是想不到什么好的方式在不影响速度的情况下解决这个问题…

emmm, 内存使用果然很高…  
(这个问题是几个月之前尝试过的, 试了 3 次没有成功, 今天一次就成功了, 
而且解题的时间也挺短的, 看来进步还不错)
the best solution (14ms)
看一下最好的算法是怎么解决这个问题的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
   | class Solution { public:     vector<vector<int> > permute(vector<int> &num) {         vector<vector<int> > result;
          permuteRecursive(num, 0, result);         return result;     }
                void permuteRecursive(vector<int> &num, int begin, vector<vector<int> > &result)	{         if (begin >= num.size()) {                          result.push_back(num);             return;         }
          for (int i = begin; i < num.size(); i++) {             swap(num[begin], num[i]);             permuteRecursive(num, begin + 1, result);                          swap(num[begin], num[i]);         }     } };
  | 
 
他将 permute 中的循环合并到了 permuteRecursive 里面  
核心在于 swap, 通过交换, 这样 result 就始终只有一个, 取而代之的是多了一个 int 参数传递