代码随想录算法训练营Day24| 回溯算法part01
一、回溯理论,算法模板
因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案。
回溯问题可以抽象为树形结构(n叉树),横向for循环,竖向递归
模板:
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
二、77. 组合
class Solution {
//注意输入输出格式
List<List<Integer>> result=new ArrayList<>();
LinkedList<Integer> path=new LinkedList<>();
public List<List<Integer>> combine(int n, int k) {
backtracking(n,k,1);
return result;
}
public void backtracking(int n,int k,int startIndex){
//终止条件
if(path.size()==k){
//收集结果
result.add(new ArrayList<>(path));
return;
}
for(int i=startIndex;i<=n;i++){
path.add(i);//处理节点
backtracking(n,k,i+1);//递归
path.removeLast();//回溯
}
}
}