基本思想与 39 类似,也是回溯法,主要就是去重了
class Solution {
private List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<Integer> combine = new ArrayList<>();
Arrays.sort(candidates);
backtrack(candidates, target, combine, 0, 0);
return res;
}
public void backtrack(int[] candidates, int target, List<Integer> combine, int index, int sum){
if(target == sum){
res.add(new ArrayList<Integer>(combine));
return;
}
for(int i = index; i < candidates.length; i++){
//跳过重复的数字
if(i > index && candidates[i] == candidates[i - 1]) continue;
int rs = candidates[i] + sum;
if(rs <= target){
combine.add(candidates[i]);
//因为每个数字只能用一次,所以下次遍历的时候不从自己开始
backtrack(candidates, target, combine, i + 1, rs);
combine.remove(combine.size() - 1);
}else{
break;
}
}
}
}