//回溯就是递归+for循环
//关键是找到递归的深度和for循环的宽度
class Solution {
//依旧需要两个集合来存放结果
//变量的定义,建议用全局,避免开辟加载新内存
List<Integer> path = new LinkedList<>();
List<List<Integer>> res = new LinkedList<>();
public List<List<Integer>> combinationSum3(int k, int n) {
backtracking(n,k,0,1);
return res;
}
//定义回溯算法,先定义其参数
public void backtracking(int targetSum,int k,int sum,int index){
//终止条件
if(path.size()==k){
if(sum==targetSum) //如果等于目标值,那么就将其添加到结果中
res.add(new LinkedList<>(path));
return; //即使没有得到相应的结果,递归深度到了,也得返回
}
//单层递归逻辑
for(int i=index;i<=9;i++){
sum+=i; //此层的操作
path.add(i);
//回溯就是开始下一层的操作
backTracking(k,sum,targetSum,i+1);
//然后将继续返回第一层
sum-=i;
path.remove(path.size()-1);
}
}
}
216. 组合总和 III
于 2022-03-21 22:29:45 首次发布