力扣:组合总和java
流程:
定义一个path和二维数组result
回溯三部曲:
参数和返回值:返回空,参数为当前传入数组ca、目标值、当前路径的和,开始遍历下标startindex
单层递归逻辑:
for循环(i=startindex;i<传入数组的长度;i++)
path加入当前节点
sum加上当前值
递归(当前传入数组ca、目标值、当前路径的和,i)
回溯:sum减当前值,path弹出最后一个
代码:
class Solution {
List<List<Integer>> result = new ArrayList<>();//结果集
LinkedList<Integer> path = new LinkedList<>();//当前路径
public List<List<Integer>> combinationSum(int[] candidates, int target) {
sumCombination(candidates,target,0,0);//调用函数
return result;
}
public void sumCombination(int[] candidates, int target,int sum,int startindex){
if(target<sum) return;//结束条件,sam大于目标值
if(target == sum){//等于目标值,则输出path到结果集
result.add(new ArrayList<>(path));
return;
}
for(int i = startindex;i<candidates.length;i++){//i赋值为开始节点下标
path.offer(candidates[i]);//输入节点
sum+=candidates[i];//sum加上当前节点
sumCombination(candidates,target,sum,i);
//单层递归,由于可以在下一层取自己,则startindex取i,而不是取i+1。
path.removeLast();//回溯
sum-=candidates[i];
}
}
}