题目地址(78. 子集)
https://leetcode-cn.com/problems/subsets/
题目描述
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]提示:1 <= nums.length <= 10-10 <= nums[i] <= 10nums 中的所有元素 互不相同
前置知识
公司
- 暂无
思路
如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!
关键点
代码
- 语言支持: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 为数组长度。
- 时间复杂度:
#card=math&code=O%28n%29&id=N1IVo)
- 空间复杂度:
#card=math&code=O%28n%29&id=WLfnk)
