回溯法理论基础
回溯是递归的副产品,递归后紧跟着回溯
是暴力搜索,穷举所有可能,顶多在for循环里做做剪枝,所以该算法效率不高。
问题分类:组合、切割、排列、子集、棋盘
77.组合
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void trackingback(int n,int k,int startindex){
if(path.size()==k) {
result.push_back(path);
return;
}
for(int i=startindex;i<=n;i++){
path.push_back(i);
trackingback(n,k,i+1);
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
result.clear();
path.clear();
trackingback(n,k,1);
return result;
}
};
借用组合题,对回溯法进行模板整理
终止条件,递归参数的确定,递归逻辑。
for循环就是遍历集合区间,可以理解一个节点有多少个孩子,这个for循环就执行多少次。
backtracking这里自己调用自己,实现递归。