Skip to content
On this page

40. 组合总和 II

原题链接:LeetCode 40. 组合总和 II

题目描述

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

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

**注意:**解集不能包含重复的组合。

示例 1:

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

示例 2:

输入: candidates = [2,5,2,1,2], target = 5, 输出: [ [1,2,2], [5] ]

提示:

- `1 <= candidates.length <= 100`

- `1 <= candidates[i] <= 50`

- `1 <= target <= 30`

难度: Medium


题解代码

javascript
/**
 * @param {number[]} candidates
 * @param {number} target
 * @return {number[][]}
 */
var combinationSum2 = function(candidates, target) {
  const ret = []
  candidates = candidates.sort((m, n) => m -n)
  backTrack(candidates, target, [], ret, 0)
  return ret
};

function backTrack (nums, remain, path, ret, start) {
  if (!remain) ret.push(path)
  if (start > nums.length - 1) return
  for (let i = start; i < nums.length; i++) {
    if (nums[i] > remain) return // 这里减枝
    path.push(nums[i])
    backTrack(nums, remain - nums[i], [...path], ret, i + 1)
    path.pop()
    while(nums[i + 1] === nums[i]) {
      i++
    }
  }
}

技术文档集合