var subsets = function(nums) {
const ans = [];
const n = nums.length;
for (let mask = 0; mask < (1 << n); ++mask) {
const t = [];
for (let i = 0; i < n; ++i) {
if (mask & (1 << i)) {
t.push(nums[i]);
}
}
ans.push(t);
}
return ans;
};
子集的个数为
2
n
2^n
2n。于是我们遍历从0到
2
n
−
1
2^n-1
2n−1遍历mask。遍历到每个mask就求对应的序列,再由序列得到数组的值。
比较难理解的就是由mask求序列。
举个例子,数组num为[1,2,3]。
当mask为5时,将mask(101)分别与001、010、100(
2
i
2^i
2i)做&。
101&001=001=1(对应位做&)
101&010=000=0
101&100=100=1
1即为true,所以取第1、3个数。
因为
2
i
2^i
2i中只有1位为1,只有mask中对应的位也为1,才能保证结果不为0。所以这一步就是筛选出mask中值为1的位数。