题目描述
AC代码
/*
迭代做法:
假设nums数组中一共有三个数字,nums={1,2,3},那么我们可以通过3位二进制数去表示由这3个数组成的集合
000 {}
001 {1}
010 {2}
011 {1,2}
100 {3}
110 {2,3}
111 {1,2,3}
如果数组包含n个数字,那么我们可以用0~2的n次方-1范围内所对应的二进制数就表示.
根据n=num.length,枚举0~2的n次方-1范围内的数字,
看看这个二进制数上的哪一位是1,就把对应下标的数字加入当前子集
*/
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res=new ArrayList<>();
for(int i=0;i<1<<nums.length;i++){
List<Integer> cur=new ArrayList<>();
for(int j=0;j<nums.length;j++)
//i的二进制表示的第j位是否为1
if((i>>j&1)==1)
cur.add(nums[j]);
res.add(cur);
}
return res;
}
}
解释一下i>>j&1==1
,假设nums数组的长度是3,现在i=3,那么它的二进制表示就是011,当程序执行进入j的for循环时
j | i>>j | i>>j&1 | |
---|---|---|---|
0 | i>>0:011 | 011&001=001 | 第0位上存在1 |
1 | i>>1:001 | 001&001=001 | 第1位上存在1 |
2 | i>>2:000 | 000&001=000 | 第2位上不存在 |