1、题目描述:
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出: [ [3], [1], [2], [1,2,3], [1,3],
[2,3], [1,2], [] ]
2、思路分析:
观察输出,我们不难发现,子集的个数是2 ^(数组元素个数)个,并且子集所代表的二进制数全部小于1<<数组的长度位=2 ^(数组元素个数)个
然后就可以写一个外循环`
int sum=1<<nums.length;
for (int i = 0; i < sum ; i++)`,
然后根据2进制数中1的个数和位置取得子集
内循环2进制的位数小于数组的长度
for (int j = 0; j < nums.length; j++) {
判断具体是哪个位置是那个数,
int flag =(i >> j) & 1;//如果flag==1,则该位选(o代表不选,一个数要么选,要么不选)
3、源代码:
public static List<List<Integer>> binaryBit1(int[] nums) {
List<List<Integer>> rs=new ArrayList<List<Integer>>();
int sum=1<<nums.length;
for (int i = 0; i < sum ; i++) {
List<Integer> temp=new ArrayList<>();
for (int j = 0; j < nums.length; j++) {
int flag =(i >> j) & 1;
if (flag == 1) {
temp.add(nums[j]);
}
}
rs.add(temp);
}
return rs;
}
public static void main(String[] args) {
int nums[]={1,2,3};
System.out.println(binaryBit1(nums));
}
}