穷举数组所有子集

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]

以上是关于穷举数组所有子集的主要内容,如果未能解决你的问题,请参考以下文章

特征选择算法

子集--力扣

78.子集

78子集

LeetCode子集问题

LeetCode 腾讯精选50题--子集