穷举数组所有子集
Posted IT飞牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了穷举数组所有子集相关的知识,希望对你有一定的参考价值。
最终子序列的个数 = Math.pow(2,n),因为每个位置都有显示或者不显示两种可能,一共n个位置,所以是2的n次方;
例如数组[a,b,c],每一个子序列都可以看成是数组中每个位置是否显示,1:显示,0:不显示;
那么我们可以想到有一下组合:
0:000 => =>[]
1:001 => 1<<0 =>[a]
2:010 => 1<<1 =>[b]
3:011 => 1<<0 || 1<<1 =>[a,b]
4:100 => 1<<2 =>[c]
5:101 => 1<<0 || 1<<2 =>[a,c]
6:110 => 1<<0 || 1<<1 =>[b,c]
7:111 => 1<<0 || 1<<1 || 1<<2 =>[a,b,c]
仔细理解下上面的组合演变过程,看到二进制的字符串大概就能想到如何去做,只要去显示1位置的数即可;
也可以借用位运算&来匹配需要显示的位置,如下:
function subsets(nums){
let r=[],len=nums.length;
for(let i=0;i<1<<len;i++){
let arr=[];
//let str=[];
for(let j=0;j<len;j++){
if(i&1<<j){
//str.push(`{i:${i.toString(2)},j:${j}}`);
arr.push(nums[j]);
}
}
//console.log(str.join(","));
//console.log(`[${arr.join(",")}]`);
//console.log(new Array(60).fill("-").join(""));
r.push(arr);
}
return r;
}
subsets(["a","b","c"]);
//输出:
//0: []
//1: [a]
//2: [b]
//3: [a, b]
//4: [c]
//5: [a, c]
//6: [b, c]
//7: [a, b, c]
以上是关于穷举数组所有子集的主要内容,如果未能解决你的问题,请参考以下文章