美文网首页
39. Combination Sum

39. Combination Sum

作者: Super_Alan | 来源:发表于2018-04-14 02:54 被阅读0次

给一组候选数字(C)(没有重复)并给一个目标数字(T),找出 C 中所有唯一的组合使得它们的和为 T。

可以从 C 无限次数中选择相同的数字。

说明:

所有数字(包括目标)都是正整数。
解集合中没有相同组合。

https://leetcode.com/problems/combination-sum/description/

public List<List<Integer>> combinationSum(int[] candidates, int target) {
    ArrayList<List<Integer>> res = new ArrayList<>();
    if (candidates == null || candidates.length == 0) {
        return res;
    }
    // Arrays.sort(candidates);
    backtracking(target, 0, candidates, new ArrayList<Integer>(), res);
    
    return res;
}

private void backtracking(int target, int index, int[] nums, ArrayList<Integer> path, ArrayList<List<Integer>> res) {
    if (target == 0) {
        res.add(new ArrayList<Integer>(path));
        return;
    }
    if (target < 0 || index >= nums.length) {
        return;
    }
    
    for (int i = index; i < nums.length; i++) {
        path.add(nums[i]);
        // item 可以重复使用,故 next index 为 i
        backtracking(target - nums[i], i, nums, path, res);
        path.remove(path.size() - 1);
    }
}

follow up:
https://leetcode.com/problems/combination-sum-ii/description/
给定候选号码数组 (C) 和目标总和数 (T),找出 C 中候选号码总和为 T 的所有唯一组合。

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

注意:

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

public List<List<Integer>> combinationSum2(int[] nums, int target) {
    ArrayList<List<Integer>> res = new ArrayList<>();
    if (nums == null || nums.length == 0) {
        return res;
    }
    
    Arrays.sort(nums);
    backtracking(target, 0, nums, new ArrayList<Integer>(), res);
    
    return res;
}

private void backtracking(int target, int index, int[] nums, ArrayList<Integer> path, ArrayList<List<Integer>> res) {
    if (target == 0) {
        res.add(new ArrayList<Integer>(path));
        return;
    }
    if (target < 0 || index >= nums.length) {
        return;
    }
    for (int i = index; i < nums.length; i++) {
        
        // 该 for 循环,是对 current path next item 的尝试;
        // 当 i>index 且nums[i] == nums[i - 1], 
        // 说明这个 item 对 current path next item 的尝试已经在之前完成过了,
        // 就不需要,也不应该再尝试了。
        if (i > index && nums[i] == nums[i - 1]) {
            continue;
        }

        path.add(nums[i]);
        backtracking(target - nums[i], i + 1, nums, path, res);
        path.remove(path.size() - 1);
    }
}

相关文章

  • LeetCode 39. Combination Sum

    10-13 LeetCode 39. Combination Sum Combination Sum Descri...

  • [leetcode -- backtracking] 39.Co

    39. Combination Sum 题目: Given a set of candidate numbers ...

  • 组合总和

    Algorithm 39. Combination Sum[https://leetcode.com/proble...

  • 39. 组合总和

    39. 组合总和 https://leetcode-cn.com/problems/combination-sum...

  • Leetcode 【39、40、77】

    问题描述:【DFS、DP】39. Combination Sum 解题思路: 这道题和 Leetcode 【DP】...

  • [BackTracking]39. Combination Su

    分类:BackTracking/DFS 时间复杂度: O(n^2) 39. Combination Sum Giv...

  • 39. Combination Sum

    给一组候选数字(C)(没有重复)并给一个目标数字(T),找出 C 中所有唯一的组合使得它们的和为 T。 可以从 C...

  • 39. Combination Sum

    注意,sort的时候,千万不要直接改变list,要用临时数组来代替;因为递归过程中后面还要pop_back; 解法...

  • 39. Combination Sum

    Given a set of candidate numbers (candidates) (without du...

  • 39. Combination Sum

    题目分析 找出一个数组若干数的和等于 target 的所有可行解,每个元素可以重复任意次使用 + 回溯法 代码

网友评论

      本文标题:39. Combination Sum

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