剑指 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 剪枝方法和判断重复的推理。

Guess you like

Origin blog.csdn.net/MTYSYS19990212/article/details/121351555