leetcode 第78题 子集

2023-05-16

题目

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例1

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例2

输入:nums = [0]
输出:[[],[0]]

思路

这个题最直观的方法就是用递归去实现。数组的每一个数字都可以选择是否拿取。

还有一个比较巧妙的方法,就是用二进制来代表数组的每一个位置是否拿取。比如数组一共有三个数字,000代表每个数字都不拿取,001代表只拿最后一个,010代表只拿第二个。我们可以发现0 ~ 7就可以代表所有拿取方法的可能性。所以遍历的时候只需要遍历0 ~ 7,然后根据数字去判断拿取哪几个元素即可。

代码

递归

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    Stack<Integer> cache = new Stack<>();
    public List<List<Integer>> subsets(int[] nums) {
        dfs(nums, 0);
        return result;
    }
    
    public void dfs(int[] nums, int index) {
        if (index ==  nums.length) {
            result.add(new ArrayList<>(cache));
            return;
        }
        dfs(nums, index+1);
        cache.push(nums[index]);
        dfs(nums, index+1);
        cache.pop();
    }
}

时间复杂度:O(n * 2^n)。一共(2 ^ n)个状态,每种状态需要 O(n)的时间来构造子集。
空间复杂度:O(n)。即构造子集使用的临时数组的空间代价。

二进制迭代法

import java.util.ArrayList;
import java.util.List;

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> cache = new ArrayList<>();
        for (int mask = 0; mask < (1 << nums.length); mask++) {
            cache.clear();
            for (int i = 0; i < nums.length; i++) {
                if ((mask & (1 << i)) != 0) {
                    cache.add(nums[i]);
                }
            }
            result.add(new ArrayList<>(cache));
        }
        return result;
    }
}

时间复杂度和空间复杂度同递归法

总结

二进制迭代法是一个很有意思的方法,这个题目是一个非常合适的使用场景。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode 第78题 子集 的相关文章

  • MATLAB加速技巧

    1 向量化 目的 xff1a 减少for循环的使用 96 nonVecl m clear all tic A 61 0 0 000001 10 B 61 0 0 000001 10 Z 61 zeros size A y 61 0 for

随机推荐

  • Linux 开启VNCSERVER

    一般 xff0c 通过ssh来远程连接linux服务器 xff0c 进行命令操作 但是没有图形化界面确实有些不太方便 xff0c 因此可以通过ssh来启动vnc ssh和vncserver以及vnc软件的安装这里就不再介绍 首先 xff0c
  • 从输入URL到网页显示,期间发生了什么(详解)

    从输入URL到网页显示 xff0c 期间都发生了什么 解析URL操作系统协议栈TCP封装IP封装MAC封装 网卡交换机路由器到达服务器 Internet上的每一个网页都具有一个唯一的名称标识 xff0c 通常称之为URL xff08 Uni
  • KuberSphere安装harbor的配置文件解读

    span class token comment 这个配置文件 xff0c 其实就是上面部分是harbor配置 xff0c 下面都是自定义的配置需要的镜像配置 span span class token comment 综合下来 xff0c
  • SLAM综述阅读笔记六:基于图像语义的SLAM调研:移动机器人自主导航面向应用的解决方案 2020

    转自 论文阅读 A survey of image semantics based visual simultaneous localization and mapping 语义视觉SLAM综述 知乎 A survey of image s
  • keil5怎么打开keil4工程,以及keil5怎么打包成keil4工程

    如何用keil5打开keil4工程 在keil5的环境下 xff0c 打开keil4的工程文件 xff0c 会弹出下图所示窗口 xff1a 一般选择第二种方法 xff1a Install Legacy Support 下载keil4的支持包
  • window 下docker Desktop 安装更新wsl 2

    报错描述 我们安装Docker Desktop的时候 他会问我们是否需要使用WSL2 基于Windows的Linux子系统 如果我们不适用 就会使用Hyper v虚拟机运行 不过相比于虚拟机 子系统在性能方面更加出色 在我们选择使用WSL2
  • GNU sed 多行合并成一行

    只适用于GNU 的sed工具 xff08 linux版本 xff09 xff0c 其他版本的不兼容 mac下可以使用brew intsall gsed 安装gnu sed 比如 xff1a 每2行合并成一行 sed n 39 1h 1 H
  • centos7防火墙(firewalld、iptables)

    一 firewalld和iptables netfilter iptables是集成在linux2 4 x版本内核中的包过滤防火墙系统 该框架可以实现数据包过滤 xff0c 网络地址转换以及数据包管理功能 linux中的防火墙系统包括两个部
  • 51单片机-宏晶STC程序调试、烧录、硬仿真

    内容包括STC单片机内部硬件介绍 xff08 寄存器 xff09 与程序的调试 硬仿真 xff0c STC15F硬仿真及其错误处理 xff0c MCS 51仿真介绍 xff0c 全自动下载介绍等 紫色文字是超链接 xff0c 点击自动跳转至
  • 12864液晶显示原理(C程序)

    内容包括液晶屏常识 xff0c 12864液晶显示原理 xff0c 点阵型LCD文字与图形软硬件设计实例 紫色文字是超链接 xff0c 点击自动跳转至相关博文 持续更新 xff0c 原创不易 xff01 目录 xff1a 一 12864液晶
  • 0x00000040指定的网络名不再可用怎么办?

    Win11提示打印机错误0x00000040指定的网络名不再可用怎么办 xff1f 有部分Win11用户遇到了操作无法完成 xff08 错误 0X00000040 xff09 xff0c 指定的网络名不再可用的问题 xff0c 小编为大家带
  • vmware 导出导入

    vmware 导出导入 如果要换电脑 xff0c 虚拟机可以选择导出OVF文件 注意导出时有3个文件 ovf vmdk iso 三个导入时必不可缺 xff0c mf 文件是否需要没有验证
  • 2_项目都有哪些分支,分支名是什么,每个分支代表什么?

    master 主分支用来发布 dev 日常开发用的分支 test 测试用的分支 1 master 主分支用来发布 2 dev 日常开发用的分支 3 test 测试用的分支
  • zookeeper的选举机制是如何应对脑裂的

    本来想写 zookeeper的选举机制 xff0c 但是选举机制的具体流程还没研究 xff0c 只是知道了选举机制是如何避免脑裂的 xff0c 就先写个小部分 xff0c 等后面扩展 在网上看了好多文章 xff0c 都在介绍zookeepe
  • sql查询成绩表中每一科成绩最高的分数以及这个学生的名字,学科名

    前段时间面试的时候碰到这样一个面试题 xff0c 因为很久没接触sql竟然没写出来 如图有这样一张成绩表 xff1a 首先要理解group by 含义 xff1a Group By 从字面意义上理解就是根据 By 指定的规则对数据进行分组
  • flink slotSharingGroup 在本地调试的时候可能会导致程序卡住

    现象就是一个加了slotSharingGroup的程序 xff0c 在本地调试的时候可能数据流不流动 xff0c 把slotSharingGroup去掉就可以了 原因未知 xff0c hold 有路过了解的朋友可以给说一下 xff0c 或者
  • Flink的classLoader加载机制(推测)-- 记一次程序问题中的探索

    项目中需要用flink去加载c 43 43 的so文件 flink任务中如果有加载so的逻辑 xff0c 当任务挂掉之后 xff0c 再次重启的时候会报 Native Library xxx is being loaded in anoth
  • flink的侧输出(sideoutput)和OutputTag

    背景 用flink做数据处理的时候 xff0c 我们经常会想要将数据分成几类处理 xff0c 或者有一批特殊数据需要单独处理 但是我们又想复用同一个流式任务 xff0c 避免重复处理数据 这种需求 xff0c 使用sideoutput完美解
  • leetcode 第74题 搜索二维矩阵

    题目 编写一个高效的算法来判断 m x n 矩阵中 xff0c 是否存在一个目标值 该矩阵具有如下特性 xff1a 每行中的整数从左到右按升序排列 每行的第一个整数大于前一行的最后一个整数 示例1 输入 xff1a matrix 61 1
  • leetcode 第78题 子集

    题目 给你一个整数数组 nums xff0c 数组中的元素 互不相同 返回该数组所有可能的子集 xff08 幂集 xff09 解集 不能 包含重复的子集 你可以按 任意顺序 返回解集 示例1 输入 xff1a nums 61 1 2 3 输