递归
- 思路:
- 找到一个长度为 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;
};