forked from jrpillai/RecursionInCombinations
-
Notifications
You must be signed in to change notification settings - Fork 0
/
2-all-subsets.js
103 lines (79 loc) · 2.74 KB
/
2-all-subsets.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
93
94
95
96
97
98
99
100
101
102
103
/*
Given an array of distinct integers, nums, return all possible subsets.
Note: The solution set must not contain duplicate subsets. Order does not matter.
Example:
Input: [1,7,4]
Output:
[
[ 1, 7, 4 ],
[ 1, 7 ],
[ 1, 4 ],
[ 1 ],
[ 7, 4 ],
[ 7 ],
[ 4 ],
[]
]
*/
// Solution with Immediately Invoked Function Expression (IIFE) and explicitly declared current array, backtracking
function allSubsets(nums) {
const result = [];
const current = [];
// function to recursively generate results
(function generate(index) {
// base case
if (index === nums.length) return result.push(current.slice());
// take it
current.push(nums[index]);
generate(index + 1);
// leave it
current.pop();
generate(index + 1);
})(0);
return result;
}
// Test cases
console.log("allSubsets:", allSubsets([1, 7, 4]));
console.log("allSubsets:", allSubsets(["a","b","c"]));
// Solution with explicitly invoked helper function and backtracking
function allSubsetsTwo(nums) {
const result = [];
function generateSubset(index, currentSubset) {
// Base case: if we've considered all elements / reached the end of the array
if (index === nums.length) {
result.push([...currentSubset]); // make a copy of the current subset
return;
}
// Exclude the current element (leave it)
generateSubset(index + 1, currentSubset);
// Include the current element (take it)
currentSubset.push(nums[index]); // Choose
generateSubset(index + 1, currentSubset); // Explore
currentSubset.pop(); // Backtrack
}
generateSubset(0, []); // start from the first element
return result;
}
// Test cases
console.log("allSubsetsTwo:", allSubsetsTwo([1, 7, 4]));
console.log("allSubsetsTwo:", allSubsetsTwo(["a", "b", "c"]));
// Solution with spread operator and new arrays instead of backtracking
function allSubsetsSpreadOperator(nums) {
const result = [];
function generateSubset(index, currentSubset) {
// Base case: if we've considered all elements // reached the end of the array
if (index === nums.length) {
result.push(currentSubset); // Add the current subset to the result
return;
}
// Exclude the current element (leave it)
generateSubset(index + 1, [...currentSubset]);
// Include the current element (take it)
generateSubset(index + 1, [...currentSubset, nums[index]]);
}
generateSubset(0, []); // Start from the first element
return result;
}
// Test cases
console.log("allSubsetsSpreadOperator:", allSubsetsSpreadOperator([1, 7, 4])); // Expected output: all subsets of [1, 7, 4]
console.log("allSubsetsSpreadOperator:", allSubsetsSpreadOperator(["a", "b", "c"])); // Expected output: all subsets of ["a", "b", "c"]