剑指 Offer II 082. 含有重复元素集合的组合
题意:有一个含有重复元素的集合candidates ,找出集合中可以使所有数字之和为target的所有组合。组合不能重复。
思路:递归+回溯。这道题的难点在于集合中是含有重复元素的,且解集中不能含有重复组合。所以,这道题需要思考一下怎么去除重复的组合?
当存在candidates [i]==candidates[i - 1]时,此时不dfs candidates [i]了,因为candidates[i]的所有有包含 candidates [i]的组合都会包含在candidates[i - 1]的dfs结果里。
class Solution {
int n;
private List<Integer> res = new ArrayList<>();
private List<List<Integer>> ans = new ArrayList<List<Integer>>();
private int s;
public void dfs(int idx,int target,int[] candidates) {
if(idx > n) {
return;
}
if(s == target) {
ans.add(new ArrayList<Integer>(res));
}
for(int i = idx; i < n; i++) {
if(i > idx && candidates[i] == candidates[i - 1]) { //剪枝,如果candidates[i] == candidates[i - 1],则递归candidates[i - 1]的包含 candidates[i]结果会是candidates[i - 1]的子集,所以剔除这个
continue;
}
if(s + candidates[i] <= target) {
s += candidates[i];
res.add(candidates[i]);
dfs(i + 1, target, candidates);
s -= candidates[i];
res.remove(res.size() - 1);
}
}
}
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
n = candidates.length;
Arrays.sort(candidates);
dfs(0, target, candidates);
return ans;
}
}