backtracking O(k*C(n, k)) time O(C(n, k)) space
这里时间要乘k是因为最后写到res里需要k步
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public: vector<vector<int>> combine(int n, int k) { dfs(1, k, n); return res; }
void dfs(int b, int k, int n) { if (v.size() == k) { res.push_back(v); return; } for (int i = b; i <= n && v.size() + n - i + 1 >= k; ++i) { v.push_back(i); dfs(i + 1, k, n); v.pop_back(); } }
vector<int> v; vector<vector<int>> res; };
|
iterative
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public: vector<vector<int>> combine(int n, int k) { if (n <= 0 || k <= 0) return {}; vector<vector<int>> res; for (int i = 1; i <= n; ++i) { res.push_back({i}); } for (int i = 2; i <= k; ++i) { vector<vector<int>> t; for (int j = 1; j <= n; ++j) { for (const auto &v : res) { if (v.back() >= j) break; t.push_back(v); t.back().push_back(j); } } t.swap(res); } return res; } };
|