题目地址(78. 子集)

https://leetcode-cn.com/problems/subsets/

题目描述

  1. 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
  2. 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
  3. 示例 1
  4. 输入:nums = [1,2,3]
  5. 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
  6. 示例 2
  7. 输入:nums = [0]
  8. 输出:[[],[0]]
  9. 提示:
  10. 1 <= nums.length <= 10
  11. -10 <= nums[i] <= 10
  12. nums 中的所有元素 互不相同

前置知识


公司

  • 暂无

思路

如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!
image.png

关键点


代码

  • 语言支持:Java

Java Code:

class Solution {
        ArrayList<List<Integer>> res = new ArrayList<>();
        ArrayList<Integer> path = new ArrayList<>();
        public List<List<Integer>> subsets(int[] nums) {
            loop(nums ,0);
            return res;
        }
        void loop(int[] num , int startIndex){
            //此处不需要终止条件了 因为需要的是所有子节点 因为递归的下一层是i+1而for有限制 所以不会无限循环
            //每次进入loop方法 就把path添加到res中 因为和组合之添加叶子节点不同 子集是需要将每个节点的内容都添加到res中
            res.add(new ArrayList<>(path));
            for (int i = startIndex; i < num.length; i++) {
                path.add(num[i]);
                loop(num, i+1);
                path.remove(path.size()-1);
            }
        }
    }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:78. 子集 - 图2#card=math&code=O%28n%29&id=N1IVo)
  • 空间复杂度:78. 子集 - 图3#card=math&code=O%28n%29&id=WLfnk)