给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
第一种是按位运算排名不是很理想
public List<List<Integer>> subsetswei(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if (nums.length == 0) return res;
//二进制最大的数
int max = (int) Math.pow(2, nums.length);
//每一个进行循环比如是三位也就是1-7循环看看是哪一位二进制七位
for (int i = 1; i < max; i++) {
//为了循环中判断二进制中哪一位是1
int m = 1;
List<Integer> rr = new ArrayList<>();
for (int j = 0; j < nums.length; j++) {
if ((i & m) != 0) {
rr.add(nums[j]);
}
m = m << 1;
}
res.add(new ArrayList<Integer>(rr));
}
return res;
}
第二种是dfs比较理想
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if (nums.length == 0) return res;
res.add(new ArrayList());
dfs(0, nums, res, new ArrayList());
return res;
}
public void dfs(int indx, int[] nums, List<List<Integer>> res, List<Integer> rr) {
for (int i = indx; i <nums.length ; i++) {
//加入当前的数组
rr.add(nums[i]);
res.add(new ArrayList<Integer>(rr));
//继续下一个数字
dfs(i+1,nums,res,rr);
rr.remove(rr.size()-1);
}
}