# 40. 组合总和 II

// 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
// candidates 中的每个数字在每个组合中只能使用一次。
// 说明:
// 所有数字(包括目标数)都是正整数。
// 解集不能包含重复的组合。
var combinationSum2 = function(candidates, target) {
  if (candidates.length === 0) return [];
  candidates = candidates.sort((a, b) => a - b);
  const totalArr = [];

  function dfs(arr, res, start) {
    for (let i = start; i < candidates.length; i++) {
      const item = candidates[i];
      if (i - 1 >= start && item === candidates[i - 1]) continue;
      const sum = res + item;
      if (sum === target) {
        totalArr.push([...arr, item]);
        break;
      } else if (sum > target) {
        continue;
      } else {
        dfs([...arr, item], sum, i + 1);
      }
    }
  }

  dfs([], 0, 0);

  return totalArr;
};

console.log(combinationSum2([10, 1, 2, 7, 6, 1, 5], 8));
console.log(combinationSum2([2, 5, 2, 1, 2], 5));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Last Updated: 6/27/2023, 7:40:45 PM