给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出: [
[3], [1], [2],
[1,2,3],
[1,3], [2,3], [1,2],
[]
]
思路:位运算法,假如nums.length = 3;那么就有2的3次方也就是8个子集,可以将0到7转换为二进制,0代表不取,1代表取。
代码:
public static void main(String[] args) {
/*Scanner sc = new Scanner(System.in);
int len = sc.nextInt();
int[] nums = new int[len];
for(int i = 0;i < len;i++){
nums[i] = sc.nextInt();
}*/
int[] nums = {1,2,3,4,5};
System.out.println(subsets(nums));
}
public static List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> list1 = new ArrayList<>();
//计算有多少个子集
int count = (int)Math.pow(2, nums.length);
//依次将i传递到Test方法中,进行位运算
for(int i = 0;i < count;i++){
list1.add(Test(nums,i));
}
return list1;
}
private static List<Integer> Test(int[] nums, int i) {
List<Integer> list2 = new ArrayList<>();
//定义n用于做数组nums的下标
int n = 0;
/*
* 如果i不等于0,那么就对i进行位运算,
* 结果为1就将nums[n]添加到list2中,
* 最后将n++;
* i向右移一位
*/
while(i != 0){
if((i&1) == 1){
list2.add(nums[n]);
}
n++;
i>>=1;
}
return list2;
}
代码有点看不明白的话,可以手动带值运算一下。