给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。
注意: 解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,输出:[[1,1,6],[1,2,5],[1,7],[2,6]]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5,输出:[[1,2,2],[5]]
提示:
1 <= candidates.length <= 1001 <= candidates[i] <= 50-
解法一:回溯
function combinationSum2(candidates: number[], target: number): number[][] {let res: Array<Array<number>> = []candidates.sort((a, b) => a -b)let n = candidates.lengthlet used = Array(n).fill(false)function recursion(total: number, path: Array<number>, idx: number) {if (total > target) {return}if (total === target) {res.push([...path])return}for (let i = idx; i < n; i++) {const tmp = candidates[i]if (total + tmp > target) {break}if (i > 0 && tmp === candidates[i-1] && !used[i-1]) {continue}total += tmppath.push(tmp)used[i] = truerecursion(total, path, i + 1)path.pop()total -= tmpused[i] = false}}recursion(0, [], 0)return res};
