所有子集——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;
    }
}
posted @ 2022-01-07 13:02  言思宁  阅读(97)  评论(0编辑  收藏  举报