子集算法
文章目录

可以使用递归实现但是下面这个算法更好.

比如需要取 [1,2,3]:

结果为:

1
2
3
4
5
6
7
8
[]
[1]
[2]
[1, 2]
[3]
[1, 3]
[2, 3]
[1, 2, 3]

实际上就是对每一位取了 000, 001, 010, 011, 100, 101, 110, 111 的或算法

那么实际上使用 0-7 的二进制转化然后使用移位就可以很快得到所有子集:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var f = (nums) => {
var subSets = [] /* 所有子集结果 */
var binCount = 0; /* 当前的二进制数字 */
for (let i = 0; i < Math.pow(2, nums.length); i++) {
var subSet = [];
var selectValue = binCount;
for (let d = 0; d < nums.length; d++) {
var select = selectValue % 2 === 1;
if (select) {
subSet.push(nums[d]);
}
selectValue = selectValue >> 1; /* 将二进制应用于每一个下标 */
}
subSets.push(subSet);
binCount++;
}
return subSets
};

f([1, 2, 3, 4, 5, 6]); /* 简简单单 */