假设有一个list [1,2,3],要求出list的全部子集!
假设一个list的长度为n,那么它就包含
个子集(包含空集)。一样的,1个长度为 n 的二进制字符串,能够表示
个数。java
因此咱们不难联想到,要求list的子集,其实就是位运算:code
[ ] ——> 0 0 0 ——> 0字符串
[1] ——> 1 0 0 ——> 4class
[2] ——> 0 1 0 ——> 2List
[3] ——> 0 0 1 ——> 1遍历
[1,2] ——> 1 1 0 ——> 6二进制
[1,3] ——> 1 0 1 ——> 5im
[2,3] ——> 0 1 1 ——> 3img
[1,2,3] ——> 1 1 1 ——> 7集合
因此要获得长度为 n 的list的子集,只须要遍历从 0—
-1 ,而后转化成二进制,把对应位置为 1 的数字放入集合。
十进制转二进制:
由于我使用的是Java,在Java中有现成的语句可以调用:
int a = 8
b = Integer.toBinaryString(a);
输出:b = "1000"
固然也能够按照二进制的定义本身写:
public int toBinary(int num) {
int r = 0;
int k = 1;
int sum = 0;
while(num != 0) {
r = num % 2;
sum += r*k;
k *= 10;
num /= 2;
}
return sum;
}
完整代码(Java):
public List> subsets(int[] nums) {
List> sets = new ArrayList>();
for(int i=0;i<=Math.pow(2, nums.length)-1;i++) {
List list = new ArrayList();
String a = Integer.toBinaryString(i); //转化为二进制
for(int j=0;j
char c = a.charAt(j); //取到String中的每一个字符
if(c == '1') list.add(nums[nums.length-a.length()+j]); //把对应位置为1的数字放入集合
}
sets.add(list);
}
return sets;
}