forked from ecmadao/algorithms
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNo78.subsets.js
More file actions
80 lines (74 loc) · 1.7 KB
/
No78.subsets.js
File metadata and controls
80 lines (74 loc) · 1.7 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
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
/**
* Difficulty:
* Medium
*
* Desc:
* Given a set of distinct integers, nums, return all possible subsets.
*
* Example:
* If nums = [1,2,3], a solution is:
* [
* [3],
* [1],
* [2],
* [1,2,3],
* [1,3],
* [2,3],
* [1,2],
* []
* ]
*
* Note:
* The solution set must not contain duplicate subsets.
*
* 从数组中求出所有没有重复元素的组合
* 跟上一题 No77.Combinations 一样的思路,只是稍微复杂了一点
*/
/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsets = function(nums) {
var results = [[]];
var max = nums.length;
var chooseNum = function(result, min, layer, maxLayer) {
for (var i = min + 1; i < max; i += 1) {
result.push(nums[i]);
if (layer === maxLayer) {
results.push(result.slice(0));
} else {
chooseNum(result, i, layer + 1, maxLayer);
}
result.pop();
}
}
for (var i = 0; i < nums.length; i += 1) {
var num = nums[i];
results.push([num]);
var length = 2;
while(length <= nums.length - i) {
chooseNum([num], i, 2, length);
length += 1;
}
}
return results;
};
/**
* Solution2:
* 已知数组中没有重复元素,所以我们不用考虑过滤问题
* 遍历数组,对于每一个元素,都把它加入到之前生成的子集中,返回一组新的子集,这个子集就是该元素所能够生成的子集
* 然后把这组子集加入到要返回的结果中去
*/
const subsets = (nums) => {
const results = [[]];
for (let i = 0; i < nums.length; i += 1) {
const arr = results.map((item) => {
return [
...item,
nums[i]
];
});
results.push(...arr);
}
return results;
};