代码随想录算法训练营第二十四天|● 理论基础 ● 77. 组合
回溯理论基础
回溯法,与递归有类似形式,本质是穷举(可能存在剪枝),效率并不高。
回溯的模板:
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
组合
思路:回溯法还是挺不好想的,用递归函数内的for循环来完成横向遍历,用递归来完成纵向遍历。对我而言还是挺有难度的。
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void backtracking(int n,int k,int start){
if(path.size()==k){
result.push_back(path);
return;
}
for(int i=start;i<=n;i++){
path.push_back(i);
backtracking(n,k,i+1);
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
backtracking(n,k,1);
return result;
}
};