子集问题
78. 子集
常规方法暂不介绍,介绍一种巧妙的解法:二进制遍历
每次构造一个子集,原数组每个元素都有两种情况:选和不选,对应到二进制的 0、1,于是可以一个二进制数对应一个子集,比如:0000 对应空集, 1111 对应全集。
代码如下
class Solution {
public List<List<Integer>> subsets(int[] nums) {
int n = nums.length;
List<List<Integer>> res = new ArrayList<>();
for(int i = 0; i < 1 << n; i++){
List<Integer> tmp = new ArrayList<>();
for(int j = 0; j < n; j++){
if(((i >> j) & 1) == 1){
tmp.add(nums[j]);
}
}
res.add(tmp);
}
return res;
}
}