美文网首页
leetcode 40. 组合总和 II(Java版)

leetcode 40. 组合总和 II(Java版)

作者: M_lear | 来源:发表于2019-06-16 21:50 被阅读0次

题目描述(题目难度,中等)

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次。

说明:

  • 所有数字(包括目标数)都是正整数。
  • 解集不能包含重复的组合。

示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:

[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]

示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:

[
  [1,2,2],
  [5]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目求解

使用递归求解,递归的过程其实就是一个选数的过程,只要递归过程中,所选数的和不超过目标数 target,就把所选的数保存到临时列表中。一旦所选数的和等于 target,就将临时列表加入结果集。
参考代码如下:

class Solution {
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(candidates); // 去重的第一步
        comSum(candidates, target, result, new ArrayList<>(), 0);
        return result;
    }
    void comSum(int[] can, int tar, List<List<Integer>> res, List<Integer> canRes, int low){
        if(tar == 0){
            res.add(new ArrayList<>(canRes));
            return;
        }
        for(int i = low; i < can.length; ++i){
            if(i > low && can[i-1] == can[i]) continue; // 去重的第二步
            if(can[i] <= tar){
                canRes.add(can[i]);
                comSum(can, tar-can[i], res, canRes, i+1);
                canRes.remove(canRes.size()-1);
            }else return;
        }
    }
}

递归函数最后一个参数表示的是选数的起始位置,i 表示当前所选数的位置,那么递归时最后一个实参置为 i+1,表示下次会在当前所选数的后面开始选数,这样就能满足题目“每个数字在每个组合中只能使用一次”的要求。
但由于 candidates 数组中本身会有重复数字出现,所以单纯按 和等于 target 的条件去选,会有重复的组合出现。为了在递归时就去掉重复组合,就需要将 candidates 数组排序,把相同的数聚在一起(其实只要能把相同的数聚在一起,不排序也可以),然后增加判断条件 i > low && can[i-1] == can[i],就可以将重复组合过滤掉,这个条件一定要细心体会,leetcode 之前的题目三数之和的解法二中也使用了同样的方法去重。

相关文章

  • 40. 组合总和 II

    40. 组合总和 II(难度:中等) 题目链接:https://leetcode-cn.com/problems/...

  • leetcode 40. 组合总和 II(Java版)

    题目描述(题目难度,中等) 给定一个数组 candidates 和一个目标数 target ,找出 candida...

  • leetcode题目40. 组合总和 II(java)

    题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以...

  • 40. 组合总和 II

    给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为...

  • 40.组合总和II

    题目给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字...

  • 40.组合总和 II

    自己解法 标准的回溯加剪枝,思路很清晰,但是在细节上出了点小问题,一个是递归的时候应该用i+1,用成了start ...

  • 40. 组合总和 II

    题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以...

  • 40. 组合总和 II

    题目 40. 组合总和 II 给定一个数组 candidates 和一个目标数 target ,找出 candid...

  • LeetCode 力扣 40. 组合总和 II

    题目描述(中等难度) 和上一道题非常像了,区别在于这里给的数组中有重复的数字,每个数字只能使用一次,然后同样是给出...

  • backtracking——40. 组合总和 II

    这道题与39不一样的是,元素不能重复使用,但还是没有顺序的,所以自然而然想到的是每次把start+1就好了。 但这...

网友评论

      本文标题:leetcode 40. 组合总和 II(Java版)

      本文链接:https://www.haomeiwen.com/subject/ejcnfctx.html