每一次向下搜索时,起始位置都和上一次相同,因为可以取相同元素不止一次,即每次向下传入的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;
}
}