Ray-56/like-algorithms

✅39. 组合总和

Opened this issue · 1 comments

39. 组合总和

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

candidates 中的数字可以无限制重复被选取。

说明:

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

示例 1:

输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
  [7],
  [2,2,3]
]

示例 2:

输入:candidates = [2,3,5], target = 8,
所求解集为:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]

提示:

  • 1 <= candidates.length <= 30
  • 1 <= candidates[i] <= 200
  • candidate 中的每个元素都是独一无二的。
  • 1 <= target <= 500

深度递归,以[2, 3, 5]举例

2开始

  • 选择自己,就是[2]再与[2, 3, 5],再次递归

  • 不选自己,就是[]再与[2, 3, 5],直到条件满足退出递归

/**
 * @param {number[]} candidates
 * @param {number} target
 * @return {number[][]}
 */
var combinationSum = function(candidates, target) {
    const ret = [];
    dfs(target, [], 0);
    function dfs(target, combine, index) {
        if (index >= candidates.length) return;
        if (target === 0) {
            ret.push(combine);
            return;
        }

        // 不选当前
        dfs(target, combine, index + 1);

        // 满足条件,选择当前
        if (target - candidates[index] >= 0) {
            dfs(target - candidates[index], [...combine, candidates[index]], index);
        }
    }

    return ret;
};