给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
解法一:
因为给出的数字不含重复的,所以数据很小。可以利用二进制位确定当前这个数选还是不选,0 - 2的n-1次方减一, 每个数的二进制代表一种选法
import java.util.ArrayList;
import java.util.List;
class Solution {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
public List<List<Integer>> subsets(int[] nums) {
int n = 1 << nums.length;
for(int i = 0 ; i < n ; i++){
List<Integer> list = new ArrayList<>();
for(int j = 0,m = i ; j < nums.length ; j++,m >>= 1){
if((m & 1) == 1){
list.add(nums[j]);
}
}
ans.add(list);
}
return ans;
}
}
解法二:dfs 每个数有选和不选两个情况
class Solution {
List<Integer> t = new ArrayList<Integer>();
List<List<Integer>> ans = new ArrayList<List<Integer>>();
public List<List<Integer>> subsets(int[] nums) {
dfs(0, nums);
return ans;
}
public void dfs(int cur, int[] nums) {
if (cur == nums.length) {
ans.add(new ArrayList<Integer>(t));
return;
}
//选
t.add(nums[cur]);
dfs(cur + 1, nums);
//恢复现场
t.remove(t.size() - 1);
//不选
dfs(cur + 1, nums);
}
}