class Solution {
public List> combinationSum(int[] candidates, int target) {
}
}
1.对于第一个例子
对target 7 分别减去每一个数组中元素后剩余为5,4,1,0
2.然后对剩余值再次进行同样减去数组中每一个元素
3.对得到的结果进行分析,如果为0则计入结果集中,
如果小于0,则不用继续回溯,直接返回
注意:1.先对数组进行排序,就不会出现重复结果的现象
2.因为每一个数字可以重复使用,所以下一个遍历的起点就是当前i
如果是0的话就像图中红色部分的2,结果集中会出现[2,2,3],[3,2,2]重复结果
List> result = new ArrayList>();
public List> combinationSum(int[] candidates,int target){
//先对数据做排序,就可以去掉重复情况
Arrays.sort(candidates);
//System.out.print(Arrays.toString(candidates));
//用来存储每一组正确答案
List list = new ArrayList<>();
//进行回溯的过程
backTrace(list,target,0,candidates);
return result;
}
private void backTrace(List list, int target,int start, int[] candidates){
//什么时候可以存入结果中?当回溯的target为0的时候
if(target == 0){
result.add(new ArrayList<>(list));
return;
}
//因为每一个位置的元素都可以重复使用,所以下一个遍历的起位置是当前i
//如果target减去candidates[i]这个位置的结果小于0,则没有继续回溯的意义
for(int i = start;i < candidates.length && target >= candidates[i];i++){
list.add(candidates[i]);
backTrace(list,target-candidates[i],i,candidates);
list.remove(list.size()-1);
}
}