算法记录
LeetCode 题目:
给定一个可能有重复数字的整数数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
说明
一、题目
candidates 中的每个数字在每个组合中只能使用一次,解集不能包含重复的组合。
二、分析
- 题的难点就在于怎么区分重复元素,我们在一轮的循环探测里面如果往后再找到一个连续两个值相等,是不是就有理由认为这两个下标的答案会让结果重复呢?
- 其余的剪枝部分和普通的
dfs
退层是一样的。
class Solution {
private List<List<Integer>> ret = new ArrayList();
private LinkedList<Integer> ans = new LinkedList();
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
dfs(candidates, target, 0);
return ret;
}
public void dfs(int[] candidates, int target, int index) {
if(target == 0) {
ret.add(new LinkedList(ans));
return ;
}
for(int i = index; i < candidates.length; i++) {
if(target < candidates[i]) return;
if(i > index && candidates[i] == candidates[i - 1]) continue;
ans.add(candidates[i]);
dfs(candidates, target - candidates[i], i + 1);
ans.removeLast();
}
}
}
总结
熟悉 dfs
剪枝方法和判断重复的推理。