递归
- 思路:
- 找到一个长度为?nnn?的序列?aaa?的所有子序列,代码框架:
-
std::vector<int> temp;
void dfs(int cur, int n) {
if (cur == n + 1) {
// 记录答案
// ...
return;
}
// 考虑选择当前位置
temp.push_back(cur);
dfs(cur + 1, n, k);
temp.pop_back();
// 考虑不选择当前位置
dfs(cur + 1, n, k);
}
- 本题递归结束条件为序列中元素为 k,即:
-
void dfs(int cur, int n, int k) {
// 序列元素个数满足条件,存储结果退出
if (item.size() == k) {
result.push_back(item);
return;
}
// 考虑选择当前位置
item.push_back(cur);
dfs(cur + 1, n, k);
item.pop_back();
// 考虑不选择当前位置
dfs(cur + 1, n, k);
}
private:
std::vector<int> item;
std::vector<std::vector<int>> result;
- 已经构建的序列S',剩余的数不足以构成满足条件的序列 S:
- 剩余的数长度 n - (cur - 1)
- size(S') + (n - (cur - 1)) < size(S) = k
- 这种情况也需要退出递归
- 综上,完整代码
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
dfs(1, n, k);
return result;
}
private:
void dfs(int cur, int n, int k) {
if (item.size() + (n -cur + 1) < k) {
return;
}
if (item.size() == k) {
result.push_back(item);
return;
}
item.push_back(cur);
dfs(cur + 1, n, k);
item.pop_back();
dfs(cur + 1, n, k);
}
private:
std::vector<int> item;
std::vector<std::vector<int>> result;
};