每一次向下搜索时,起始位置都和上一次相同,因为可以取相同元素不止一次,即每次向下传入的index
For循环每次从index开始,避免返回到之前的元素
DFS搜索
如果sum>target 则return
如果sum == target 则记录下来
否则 继续DFS搜索
public class Solution {
public List<List<Integer>> ans = new ArrayList<>();
public List<Integer> tmp = new ArrayList<>();
public void robot(int index,int[] candidates, int target,int sum){
if(index <0 || index >candidates.length || sum>target)
return;
//边界条件
if(sum==target ){
//record the ans
ans.add(new ArrayList<>(tmp));
return;
}
for(int i=index;i<candidates.length;i++){
//加上i位置上的数
sum += candidates[i];
tmp.add(candidates[i]);
robot(i,candidates,target,sum);
//不加上i位置上的数
tmp.remove(tmp.size()-1);
sum-=candidates[i]; //sum需要减去i位置上的数字
//第二种写法 这里的i并没有往后移位 因为可以重复选择
/* tmp.add(candidates[i]);
robot(i,candidates,target,sum+candidates[i]);
tmp.remove(tmp.size()-1);
*/
}
}
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
robot(0,candidates,target,0);
return ans;
}
}

本文详细解析了如何使用深度优先搜索(DFS)算法解决组合总和问题,通过递归方式寻找所有可能的数字组合,使得这些数字之和等于目标值。文章通过具体代码示例展示了算法的具体实现过程。
279

被折叠的 条评论
为什么被折叠?



