穷举数组所有子集

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]

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

特征选择算法

c_cpp 生成数组的所有子集

[Leetcode] subsets 求数组所有的子集

1863. 找出所有子集 的异或总和 再求和回溯

[Leetcode] subsets ii 求数组所有的子集

78. 子集