求一个数组的子集(经典面试题)
偶然在网上看到这样一个题,觉得很有意思,总结下来它的算法
题目描述
现在给定一个包含N个数的集合,请你输出它的所有子集。
注意:题目保证 0 <= N <= 1000000
输入样例
3
1 3 5
输出样例(前后顺序不固定)
16
(空行)
1
3
5
1 3
1 5
3 5
1 3 5
得到的思考
如果我们考虑一个O(N^2)的算法,肯定是过不去的,所以我们来想想其他办法
我们高中时学过:一个含有n个元素的集合的子集个数为
2
n
2^n
2n,因此我们联系二进制
从
000
−
111
000-111
000−111一共八个数,分别是:
000
,
001
,
010
,
011
,
100
,
101
,
110
,
111
000,001,010,011,100,101,110,111
000,001,010,011,100,101,110,111
所以我们就明白了:用1表示这个元素要取,0表示不取,这样我们就完成了输出。
伪代码
让 i i i从 0 − > n − 1 0 - >n-1 0−>n−1跑一趟循环,配合>>和&1把最低二进制位取出来,然后判断对应的元素是否输出就好。