Leetcode78. 子集
题目:
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
题解:
方案一:循环迭代
开始假设输出子集为空,每一步都向子集添加新的整数,并生成新的子集。
方案二:二进制方式
定义一个二进制位掩码,比如nums的长度时3,那么定义的二进制位掩码为:
000
001
010
011
100
101
110
111
如果当前位置的值为1,那么将当前位的数据添加到list中。
通过下面代码实现二进制位掩码:
for (int i = (int) Math.pow(2, 3); i < (int) Math.pow(2, 3 + 1); ++i) {
//十进制数转换成二进制
String bitmask = Integer.toBinaryString(i).substring(1);
System.out.println("i:" + i + "====" + bitmask);
}
java代码:
/**
* 迭代运算
* 开始假设输出子集为空,每一步都向子集添加新的整数,并生成新的子集。
* (),(1),(2),(1,2),(3),(1,3),(2,3),(1,2,3)
*
* @param nums
* @return
*/
public static List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> output = new ArrayList<>();
output.add(new ArrayList<Integer>());
for (int num : nums) {
List<List<Integer>> newSubsets = new ArrayList<>();
for (List<Integer> curr : output) {
List<Integer> list = new ArrayList<>(curr);
list.add(num);
newSubsets.add(list);
}
for (List<Integer> curr : newSubsets) {
output.add(curr);
}
}
return output;
}
/**
* 二进制运算
*
* @param nums
* @return
*/
public static List<List<Integer>> subsets2(int[] nums) {
List<List<Integer>> output = new ArrayList<>();
int n = nums.length;
for (int i = (int) Math.pow(2, n); i < (int) Math.pow(2, n + 1); i++) {
String substring = Integer.toBinaryString(i).substring(1);
List<Integer> list = new ArrayList<>();
for (int j = 0; j < n; j++) {
if (substring.charAt(j) == '1') {
list.add(nums[j]);
}
}
output.add(list);
}
return output;
}
791

被折叠的 条评论
为什么被折叠?



