-
Notifications
You must be signed in to change notification settings - Fork 78
Expand file tree
/
Copy pathindex.js
More file actions
52 lines (49 loc) · 1.71 KB
/
index.js
File metadata and controls
52 lines (49 loc) · 1.71 KB
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
/**
* @param {number[]} candidates - candidate numbers we're picking from.
* @param {number} remainingSum - remaining sum after adding candidates to currentCombination.
* @param {number[][]} finalCombinations - resulting list of combinations.
* @param {number[]} currentCombination - currently explored candidates.
* @param {number} startFrom - index of the candidate to start further exploration from.
* @return {number[][]}
*/
const combinationSumRecursive = (
candidates,
remainingSum,
finalCombinations = [],
currentCombination = [],
startFrom = 0
) => {
if (remainingSum === 0) {
finalCombinations.push(currentCombination.slice());
currentCombination = [];
return finalCombinations;
}
else {
if (remainingSum < 0)
return [];
else {
for (let currentIndex = startFrom; currentIndex < candidates.length; currentIndex++) {
const currentNumber = candidates[currentIndex];
combinationSumRecursive(
candidates,
remainingSum - currentNumber,
finalCombinations,
[...currentCombination, currentNumber],
currentIndex
);
}
return finalCombinations;
}
}
}
/**
* Backtracking algorithm of finding all possible combination for specific sum.
*
* @param {number[]} candidates
* @param {number} target
* @return {number[][]}
*/
const combinationSum = (candidates, target) => {
return combinationSumRecursive(candidates, target);
}
module.exports = combinationSum;