题目
给你一个整数数组 nums ,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。
解集不能包含重复的子集。你可以按任意顺序返回解集。
题解
方法1
以[1,2,3]为例:
num | len | res |
---|---|---|
[] | ||
1 | 1 | [] [1] |
2 | 2 | [],[1] [2],[1,2] |
3 | 4 | [],[1],[2],[1,2] [3],[1,3],[2,3],[1,2,3] |
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
res.add(new ArrayList<>());
for(int num : nums) {
int len = res.size();
for(int i = 0; i < len; ++i) {
List<Integer> tmp = new ArrayList<>(res.get(i));
tmp.add(num);
res.add(tmp);
}
}
return res;
}
}
方法2:回溯
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> tmp = new ArrayList<>();
if(nums.length == 0) {
res.add(tmp);
return res;
}
subsetsHelper(nums, res, tmp, 0);
return res;
}
public void subsetsHelper(int[] nums, List<List<Integer>> res, List<Integer> tmp, int idx) {
//if(idx >= nums.length) return;
res.add(new ArrayList<>(tmp)); //java集合引用传递,因此在将tmp添加进res时,需要根据tmp内容重新构造list
for(int i = idx; i < nums.length; ++i) {
tmp.add(nums[i]);
subsetsHelper(nums, res, tmp, i + 1);
tmp.remove(tmp.size() - 1);
}
}
}