当前位置: 首页 > news >正文

Leetcode 剑指 Offer II 079.子集

题目难度: 中等

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

给定一个整数数组 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] <= 10
  • nums 中的所有元素 互不相同

题目思考

  1. 如果限制只能用递归或者迭代, 如何解决?

解决方案

方案 1

思路
  • 首先我们可以尝试用递归的思路来解决
  • 观察幂集的特点, 我们可以发现它的每个子集都可以细分成两种情况: 使用原集合的某个元素以及不使用该元素
  • 大家可以将整个过程想象成一个二叉树: 每遍历到原集合的一个元素, 都可以将其分成两个分支继续向下, 直到遍历完所有元素为止
  • 我们可以基于上述分析进行递归求解, 具体做法如下:
    • 传入当前下标以及当前使用的元素组成的列表
    • 然后递归调用下一下标, 此时分为两种情况: 使用当前元素和不使用当前元素
    • 最后递归出口是下标达到原集合长度, 此时形成的列表即为幂集的其中一个子集
  • 由于原集合中不包含重复元素, 所以每个递归出口形成的列表也各不相同, 无需手动去重
复杂度
  • 时间复杂度 O(2^N): 每遍历一个元素我们都有两种选择, 所以总时间是 2^N
  • 空间复杂度 O(N): 递归栈的消耗, 对应的是上述分析中二叉树的高度, 即原集合长度 N
代码
Python 3
class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:# 方法1: 递归传入当前下标和列表res = []def getSet(i, cur):if i == len(nums):# 递归出口, 将其加入最终结果集res.append(cur)return# 两种情况/分支getSet(i + 1, cur)getSet(i + 1, cur + [nums[i]])getSet(0, [])return res

方案 2

思路
  • 接下来我们尝试用迭代的思路来解决
  • 根据方案 1 的分析, 我们不难发现幂集的所有子集都可以用一个长度为 N 的 mask 来表示 (N 是原集合长度)
  • 其中 mask 的第 i 位为 1 就对应使用下标 i 的元素, 为 0 则不使用
  • 所以我们可以依次遍历[0, 2^N-1], 统计其哪些位为 1, 从而得到对应的子集并加入结果集即可
复杂度
  • 时间复杂度 O(N*2^N): 需要遍历 2^N 个元素, 内层循环需要遍历 N 位得到具体的子集
  • 空间复杂度 O(1): 只使用了几个常数空间的变量 (结果集占用的空间不计算在内)
代码
Python 3
class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:# 方法2: 迭代+位运算n = len(nums)res = []for mask in range(1 << n):cur = []for i in range(n):if (mask >> i) & 1:# 第 i 位为 1, 使用对应下标 i 的元素cur.append(nums[i])res.append(cur)return res

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我

相关文章:

Leetcode 剑指 Offer II 079.子集

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返…...

Linux基础命令常见问题解决方案

Linux 基础命令常见问题解决方案 在Linux的日常使用中&#xff0c;用户经常会遇到各种各样的问题。本文旨在提供一个关于Linux基础命令的常见问题及其解决方案的全面指南。我们将覆盖30种不同的错误场景&#xff0c;并给出具体的解决步骤和示例&#xff0c;帮助初学者快速定位…...

LINQ(五) ——使用LINQ进行匿名对象初始化

总目录 C# 语法总目录 上一篇&#xff1a;LINQ(四) ——使用LINQ进行对象类型初始化 LINQ 五 ——使用LINQ进行匿名对象初始化 6.2 匿名类型 6.2 匿名类型 可以不用声明定义一个对象&#xff0c;直接使用new&#xff0c;然后直接赋值即可 string[] names { "Tom",…...

1小时从0开始搭建自己的直播平台(详细步骤)

本文讲述了如何从0开始&#xff0c;利用腾讯云的平台&#xff0c;快速搭建一个直播平台的过程。 文章目录 效果图详细步骤准备工作第一步&#xff1a;添加域名并检验cname配置1.先填加一个推流域名2. 点击完下一步&#xff0c;得到一个cname地址3. 将cname地址&#xff0c;配置…...

Python打包篇-exe

文章目录 pyinstallerauto-py-to-exe pyinstaller 命令行工具&#xff0c;语法自行查看官方help pip install pyinstallerauto-py-to-exe 基于pyinstaller的一款GUI工具&#xff0c;会自行打包py文件中依赖的库 pip install auto-py-to-exe auto-py-to-exe.exe //运行即可...

游戏找不到d3dcompiler_43.dll怎么办,教你5种可靠的修复方法

在电脑使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到d3dcompiler43.dll”。这个问题通常出现在游戏或者图形处理软件中&#xff0c;它会导致程序无法正常运行。为了解决这个问题&#xff0c;我经过多次尝试和总结&#xff0c;找到了以下五…...

如何使用多种算法解决LeetCode第135题——分发糖果问题

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…...

泰拉瑞亚从零开始的开服教程

前言 本教程将讲诉使用Linux系统搭建泰拉瑞亚服务器&#xff08;因为网上已经有很完善的windows开服教程了&#xff09;&#xff0c;使用的Linux发行版是Debian11,服务端使用的程序是TShock&#xff0c;游戏版本是1.4.4.9 所需要准备的 一台服务器&#xff08;本教程使用的是…...

【云原生】K8s管理工具--Kubectl详解(一)

一、陈述式管理 1.1、陈述式资源管理方法 kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口kubectl 是官方的 CLI 命令行工具&#xff0c;用于与 apiserver 进行通信&#xff0c;将用户在命令行输入的命令&#xff0c;组织并转化为apiserver 能识…...

2024.5.26.python.exercise

# # 导入包 # from pyecharts.charts import Bar, Timeline # from pyecharts.options import LabelOpts, TitleOpts # from pyecharts.globals import ThemeType # # # 从文件中读取信息 # GDP_file open("1960-2019全球GDP数据.csv", "r", encoding&quo…...

代码随想录-Day20

654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums…...

揭秘C++ String容器:字符串操作的艺术

目录 ​编辑 引言 一、初识std::string&#xff1a;构造与初始化 二、字符串的操纵艺术&#xff1a;拼接、查找与替换 三、访问与遍历&#xff1a;字符的细腻触感 四、大小与容量&#xff1a;动态调整的智慧 五、进阶功能&#xff1a;探索更多可能 结语 引言 在C标准库…...

【C++】牛客 ——DP36 abb

✨题目链接&#xff1a; DP36 abb ✨题目描述 leafee 最近爱上了 abb 型语句&#xff0c;比如“叠词词”、“恶心心” leafee 拿到了一个只含有小写字母的字符串&#xff0c;她想知道有多少个 "abb" 型的子序列&#xff1f; 定义&#xff1a; abb 型字符串满足以下…...

SpringBoot如何实现跨域?

定义一个配置类&#xff0c;实现WebMvcConfigurer接口&#xff0c;重写addCorsMappings方法 Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allow…...

SW 草图偏移 先预选

因为有些不能用链全部选,可以先框选要偏移的,再点偏移命令...

5.23 Linux中超时检测方式+模拟面试

1.IO多路复用的原理&#xff1f; IO多路复用使得一个或少量线程资源处理多个连接的IO事件的技术。对于要处理的多个阻塞的IO操作&#xff0c;建立集合并存储它们的文件描述符&#xff0c;利用单个阻塞函数去监控集合中文件描述符事件到达的情况&#xff0c;&#xff08;如果到…...

MySQL数据表索引命名规范

在数据库设计和开发过程中&#xff0c;索引是提高查询性能的重要工具。合理的索引命名规范不仅能提高代码的可读性&#xff0c;还能便于维护和管理。本文将详细介绍MySQL数据表索引的命名规范&#xff0c;包括不同类型索引的命名方法&#xff0c;并提供多个代码示例以说明如何命…...

python内置函数map/filter/reduce详解

在Python中&#xff0c;map(), filter(), 和 reduce() 是内置的高级函数(实际是class)&#xff0c;用于处理可迭代对象&#xff08;如列表、元组等&#xff09;的元素。这些函数通常与lambda函数一起使用&#xff0c;以简洁地表达常见的操作。下面我将分别解释这三个函数。 1. …...

PICO VR眼镜定制播放器使用说明文档videoplayerlib-ToB.apk

安装高级定制播放器 高级定制播放器下载地址:https://download.csdn.net/download/ahphong/89360454 仅限用于PICO G2、G3、G4、NEO系列VR眼镜上使用, 用途:用于第三方APP(开发者)调用定制播放器播放2D、3D、180、360全景视频。 VR眼镜系统请升级到最新版,可在官网下载,…...

基于51单片机的超声波液位测量与控制系统

基于51单片机液位控制器 &#xff08;仿真&#xff0b;程序&#xff0b;原理图PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.使用HC-SR04测量液位&#xff0c;LCD1602显示&#xff1b; 2.当水位高于设定上限的时候&#xff0c;对应声光报警报警&am…...

Windows Cleaner如何5步解决C盘爆红问题?完全指南助你释放宝贵空间

Windows Cleaner如何5步解决C盘爆红问题&#xff1f;完全指南助你释放宝贵空间 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否曾经面对C盘爆红的警告束手无…...

HarmonyOS DateUtil 日期工具入门:格式化、时间戳与今日信息

文章目录背景一、HarmonyOS 日期处理的痛点二、核心方法&#xff1a;getFormatDate三、时间戳自动补位四、核心方法&#xff1a;getFormatDateStr五、今日信息快速获取六、完整 Demo 演示6.1 刷新当前时间6.2 格式化演示6.3 常用格式展示6.4 基础信息 UI6.5 intl.DateTimeForma…...

为Claude Code配置Taotoken解决账号封禁与Token不足难题

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为Claude Code配置Taotoken解决账号封禁与Token不足难题 对于依赖Claude Code进行日常编程辅助的开发者而言&#xff0c;直接使用官…...

C++运算符重载的实现示例

1. 运算符重载的基本概念 运算符重载是C一项强大的特性&#xff0c;它允许我们为自定义类型&#xff08;类或结构体&#xff09;重新定义运算符的行为。通过运算符重载&#xff0c;我们可以让自定义类型像内置类型一样使用标准的运算符语法&#xff0c;使代码更加直观和自然 …...

SuperMap iDesktop中BIM模型缓存生成全攻略:从性能调优到Web端流畅加载的避坑指南

SuperMap iDesktop中BIM模型缓存生成全攻略&#xff1a;从性能调优到Web端流畅加载的避坑指南 当你在深夜加班处理一个大型商业综合体的BIM模型时&#xff0c;iDesktop突然闪退&#xff0c;进度条停留在87%——这种崩溃瞬间是否似曾相识&#xff1f;作为经历过数十个大型BIM项目…...

openpilot终极指南:如何为你的爱车快速添加自动驾驶辅助功能

openpilot终极指南&#xff1a;如何为你的爱车快速添加自动驾驶辅助功能 【免费下载链接】openpilot openpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars. 项目地址: https://gitcode.com/GitHub_T…...

OpenSSH regreSSHion漏洞深度解析与零停机修复指南

1. 这个漏洞不是“修一下配置就完事”的普通补丁OpenSSH高危漏洞&#xff08;CVE-2024-6387&#xff09;——业内已习惯称它为“regreSSHion”——不是那种改个PermitRootLogin no就能糊弄过去的配置疏漏。我是在凌晨三点被监控告警叫醒的&#xff1a;三台生产跳板机在无任何登…...

Trae+Playwright MCP:企业级浏览器自动化测试底座构建指南

1. 这不是又一个“安装教程”&#xff0c;而是一套能跑通、能维护、能交付的浏览器自动化测试底座你有没有遇到过这样的情况&#xff1a;项目刚立项&#xff0c;测试同学信心满满说“用Playwright写自动化脚本”&#xff0c;结果三天过去&#xff0c;环境还卡在npm install pla…...

LPCM框架:芯片设计自动化的机器学习新范式

1. LPCM框架概述&#xff1a;芯片设计自动化的新范式在半导体行业持续面临"摩尔定律"放缓的背景下&#xff0c;LPCM&#xff08;Large Processor Chip Model&#xff09;框架代表了一种突破性的芯片设计方法论。这个框架本质上是一个融合了多模态机器学习与强化学习的…...

2026年上海AI Agent智能体开发公司全景解析:从技术底座到产业落地的能力坐标

引言&#xff1a;先把结论放在这里。2026年的上海&#xff0c;AI Agent智能体早已不是概念展厅里的抽象模型&#xff0c;而是直接进入业务流程、改写生产力公式的现实工具。面对“上海AI Agent智能体开发公司哪家好”或者“上海智能体软件开发公司推荐”这类问题&#xff0c;很…...