Appearance
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 <= 1001 <=candidates[i]<= 501 <= 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++
}
}
}