算法小知识-----04.10-----子集

131 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

今天是周末的最后一天,还是得抓起来

子集

该题出自力扣的78题 —— 子集【中等题】,所谓题目越短,难度越大,但是也会有例外的

审题

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

image.png

  • 该题的题意也很简单,就是给出一个整型数组,找出数组的幂等子集
  • 这道题的解法从思想上可以从动态规划入手,也就是我们常说的增量
  • 解法一:
    • 实例化出返回的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;
    }
}

image.png