一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情。
今天是周末的最后一天,还是得抓起来
子集
该题出自力扣的78题 —— 子集【中等题】,所谓题目越短,难度越大,但是也会有例外的
审题
给你一个整数数组
nums,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
- 该题的题意也很简单,就是给出一个整型数组,找出数组的幂等子集
- 这道题的解法从思想上可以从动态规划入手,也就是我们常说的增量
- 解法一:
- 实例化出返回的List集合
- 先add一个空集合吗,作为一定返回
- 作出变量 = 当前的总集合的数量
- 循环当前的变量,并且加入其中
- 简单解释一下就是:每一次的组合都是从上一次的组合复制过来,并且add进去当前的变量。拷贝解集中的所有子集,将该数字与这些拷贝组成新的子集再放入解集中即可
- 所以当前题型也可以使用动态规划,存在对上一次的规律
- 这种方法是逐个枚举,空集的幂集只有空集,每增加一个元素,让之前幂集中的每个集合,追加这个元素,就是新增的子集,本质是动态规划思想,属于较简单的线性动规。
- 时间复杂度为O(n²),因为在最大情况下,内部for循环会循环列表的长度次数
- 除此之外,还存在解法二:递归,把解法一的for循环抽离出来
编码
class Solution {
List<List<Integer>> lists =new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
lists.add(new ArrayList<>());
for(int i = 0;i<nums.length;i++){
int all = lists.size();
for(int q = 0;q<all;q++){
List<Integer> list = new ArrayList<>(lists.get(q));
list.add(nums[i]);
lists.add(list);
}
}
return lists;
}
}