-
Notifications
You must be signed in to change notification settings - Fork 10
/
40_combination-sum-ii.js
92 lines (90 loc) · 2.1 KB
/
40_combination-sum-ii.js
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/**
*
* Problem:
* Given a collection of candidate numbers (`candidates`) and a target number
* (`target`), find all unique combinations in `candidates` where the candidate numbers
* sum to `target`. Each number in `candidates` may only be used once in the combination.
* Note: The solution set must not contain duplicate combinations.
* https://leetcode.com/problems/combination-sum-ii/
*
* Example 1:
* Input: candidates = [10,1,2,7,6,1,5], target = 8
* Output:
* [
* [1,1,6],
* [1,2,5],
* [1,7],
* [2,6]
* ]
*
* Example 2:
* Input: candidates = [2,5,2,1,2], target = 5
* Output:
* [
* [1,2,2],
* [5]
* ]
*
*
* Time: O(n 2^n)
* Space: O(2^n) <- result
*
* @param {number[]} candidates
* @param {number} target
* @return {number[][]}
*/
function combinationSum2(candidates, target) {
// O(n * log(n))
candidates.sort((a, b) => a - b);
const combinations = [];
_backtrack(candidates, target, 0, [], combinations);
return combinations;
}
/**
*
* @param {number[]} candidates
* @param {number} target
* @param {number} currentIndex
* @param {number[]} currentArr
* @param {number[][]} combinations
*/
function _backtrack(
candidates,
target,
currentIndex,
currentArr,
combinations
) {
/**
* Similar to the problem 90_subset-ii, the only difference here is for all
* the combinations we need to check their sum against this `target`, only
* push it to the final result when the sum is equal to `target`.
*/
if (target === 0) {
// O(n) to copy an array
combinations.push(Array.from(currentArr));
return;
}
if (target < 0) {
return;
}
for (let i = currentIndex; i < candidates.length; i++) {
if (i > currentIndex && candidates[i] === candidates[i - 1]) {
continue;
}
currentArr.push(candidates[i]);
_backtrack(
candidates,
target - candidates[i],
i + 1,
currentArr,
combinations
);
currentArr.pop();
}
}
// Test
console.log(combinationSum2([10, 1, 2, 7, 6, 1, 5], 8));
// [ [1,1,6], [1,2,5], [1,7], [2,6] ]
console.log(combinationSum2([2, 5, 2, 1, 2], 5));
// [ [1,2,2], [5] ]