剑指 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. 没有重复元素集合的全排列

算法剑指 Offer II 083. 没有重复元素集合的全排列|46. 全排列(多语言实现)

算法剑指 Offer II 083. 没有重复元素集合的全排列|46. 全排列(java / c / c++ / python / go / rust)

剑指 Offer II 016. 不含重复字符的最长子字符串

算法leetcode每日一练剑指 Offer II 080. 含有 k 个元素的组合 | 77. 组合

算法leetcode每日一练剑指 Offer II 080. 含有 k 个元素的组合 | 77. 组合