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 参数传递