回溯算法-组合问题
回溯算法框架(重点)
解决一个回溯问题,实际上就是一个决策树的遍历过程。
站在回溯树的一个节点上,你只需要思考 3 个问题:
1、路径:也就是已经做出的选择。
2、选择列表:也就是你当前可以做的选择。
3、结束条件:也就是到达决策树底层,无法再做选择的条件。
回溯算法框架
result;
void backtracking(路径、选择列表) {
if (终止条件) {
result.add(存放结果);
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
77. 组合
给定两个整数 n
和 k
,返回范围 [1, n]
中所有可能的 k
个数的组合。
你可以按 任何顺序 返回答案。
代码实现:
class Solution {
public:
vector<vector<int>> ans;
vector<int> path;
vector<vector<int>> combine(int n, int k) {
dfs(n,k,1);
return ans;
}
void dfs(int n,int k,int start){//k剩余选择数字数目
if(!k){//终止条件,说明组合数字数量够了
ans.push_back(path);
return;
}
//注意i从start开始递增
for(int i = start;i <= n;i ++){
path.push_back(i);//做选择
dfs(n,k - 1,i + 1);
path.pop_back();//撤销选择
}
}
};