所有子集——leetcode79(全组合)
所有子集
题目:所有子集
返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 :
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
题解
子集的个数:2n, 每个节点选(0)还是不选(1),构成完全二叉树。
每个叶子节点都是一个子集,用DFS遍历求解。
class Solution {
List<List<Integer>> res;
int height;
int[] array;
public void dfs(int level, int node, List<Integer> list) {
list.add(node);
if (level == height) {
List<Integer> temp = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if (list.get(i) == 1) {
temp.add(array[i]);
}
}
res.add(temp);
}
else if (level + 1 <= height) {
dfs(level + 1, 0, list);
dfs(level + 1, 1, list);
}
list.remove(list.size() - 1);
}
public List<List<Integer>> subsets(int[] nums) {
height = nums.length;
res = new ArrayList<>();
array = nums;
List<Integer> list = new ArrayList<>();
dfs(1, 0, list);
dfs(1, 1, list);
return res;
}
}
方法2:递归
class Solution {
public void dfs(int[] nums, int index, List<Integer> subset, List<List<Integer>> results) {
results.add(new ArrayList<>(subset));
for(int i=index;i<nums.length;i++) {
subset.add(nums[i]);
dfs(nums, i+1, subset, results);
subset.remove(subset.size()-1);
}
}
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> results=new ArrayList<>();
if(nums==null || nums.length==0) {
return results;
}
List<Integer> subset=new ArrayList<>();
dfs(nums, 0, subset, results);
return results;
}
}