candidates 中的每个数字在每个组合中只能使用一次,解集不能包含重复的组合。
示例:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
var combinationSum2 = function (arr, target) {
var res = [];
var brr = [];
arr.sort((a, b) => a - b);
f(0, 0);
return res;
function f(j, sum) {
if (sum == target) {
return res.push(brr.slice());
}
if (sum > target) return;
for (var i = j; i < arr.length; i++) {
if (i - 1 >= j && arr[i - 1] == arr[i]) continue;
brr.push(arr[i]);
sum += arr[i];
f(i + 1, sum);
brr.pop();
sum -= arr[i];
}
}
};
为什么加上 if (i - 1 >= j && arr[i - 1] == arr[i]) continue;,原因是如下图所示