剑指 Offer II 082. 含有重复元素集合的组合
Posted 易小顺
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer II 082. 含有重复元素集合的组合相关的知识,希望对你有一定的参考价值。
算法记录
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
剪枝方法和判断重复的推理。
以上是关于剑指 Offer II 082. 含有重复元素集合的组合的主要内容,如果未能解决你的问题,请参考以下文章
算法剑指 Offer II 083. 没有重复元素集合的全排列|46. 全排列(多语言实现)
算法剑指 Offer II 083. 没有重复元素集合的全排列|46. 全排列(java / c / c++ / python / go / rust)
剑指 Offer II 016. 不含重复字符的最长子字符串