给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
思路:进入回溯函数,对该数进行for循环,依次遍历,判断是否符合条件
重点:有样例会导致超时,如下
所以要加入这一句话
具体代码:
class Solution {
List<List<Integer>> list1=new ArrayList<>();
List<Integer> list2=new ArrayList<>();
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
dfs(candidates,target,0);
return list1;
}
public void dfs(int[] candidates,int target,int index){
int len=candidates.length;
if(target==0){
if(!list1.contains(list2)) list1.add(new ArrayList<>(list2));
}
if(target<0) return;
for(int i=index;i<len;i++){
if(i>index&&candidates[i]==candidates[i-1]) continue;
list2.add(candidates[i]);
dfs(candidates,target-candidates[i],i+1);
list2.remove(list2.size()-1);
}
}
}
//12:55
//1 1 2 5 6 7 10