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

78. 子集

46. 全排列

中等

给你一个整数数组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中的所有元素互不相同

📝 核心笔记:子集 (Subsets - 选或不选法)

1. 核心思想 (一句话总结)

“每个数字都有两种命运:要么进来,要么滚蛋。”

我们遍历数组中的每一个数字,对于 nums[i],我们只有两个分支:

  1. 不选它:直接跳过,处理下一个。
  2. 选它:把它装进path,处理下一个,回来后再把它拿出来(回溯)。

💡图像记忆 (二叉决策树):

  • 这就像走到岔路口。
  • 左拐:不带这个行李。
  • 右拐:带上这个行李。
  • 一直走到路的尽头 (i == n),也就是对所有行李都做完了决定,这时候拍张照(加入结果集)。
2. 算法流程 (三步走)
  1. Base Case (触底)
    • i == nums.length时,说明对所有数字都做过决定了。
    • 此时path里存的就是一种完整的子集方案,复制并加入ans
  1. 分支一:不选 (Exclude)
    • 啥都不做,直接dfs(i + 1)
  1. 分支二:选 (Include)
    • path.add(nums[i])
    • dfs(i + 1)
    • 回溯path.removeLast()(恢复现场,为了回退到上一层时不影响其他分支)。
🔍 代码回忆清单 (带注释版)
// 题目:LC 78. Subsets class Solution { public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> ans = new ArrayList<>(); List<Integer> path = new ArrayList<>(); dfs(0, nums, path, ans); return ans; } // i: 当前讨论到了第几个数 private void dfs(int i, int[] nums, List<Integer> path, List<List<Integer>> ans) { // 1. Base Case: 到了数组末尾 (叶子节点) // 这里的逻辑是:必须对每个数都表态后,才结算 if (i == nums.length) { ans.add(new ArrayList<>(path)); // 📸 拍照留念 (深拷贝) return; } // 2. 决策 A: 不选当前数 // 这种写法通常先写"不选",因为不需要操作 path,代码更清爽 dfs(i + 1, nums, path, ans); // 3. 决策 B: 选当前数 path.add(nums[i]); // 做选择 dfs(i + 1, nums, path, ans); // 递归 path.removeLast(); // 撤销选择 (回溯) } }
⚡ 快速复习 CheckList (易错点)
  • [ ]什么时候addans
    • 本解法 (选/不选):只有在i == n(叶子节点) 时才添加。因为中间过程的path只是半成品状态(虽然也是子集,但在这个逻辑里我们约定只在终点结算)。
    • 对比:如果是for 循环枚举的写法,是进入 DFS 每一步都add
  • [ ]先“选”还是先“不选”?
    • 都行!通常先写“不选”,因为不用写add/remove,代码看着少一行,逻辑也不乱。
  • [ ]复杂度是多少?
    • 时间:。每个数 2 种选择,共有 个子集,复制每个子集平均 。
    • 空间:。递归栈深度为 。
🖼️ 数字演练

输入nums = [1, 2]

  1. Startdfs(0): 面对 1。
  2. Branch "No 1":
    • dfs(1): 面对 2。
    • Branch "No 2":dfs(2)-> 到底 ->Add[]
    • Branch "Yes 2":path=[2]->dfs(2)-> 到底 ->Add[2]-> 回溯 (pop 2)。
  1. Branch "Yes 1":
    • path=[1]->dfs(1): 面对 2。
    • Branch "No 2":dfs(2)-> 到底 ->Add[1]
    • Branch "Yes 2":path=[1, 2]->dfs(2)-> 到底 ->Add[1, 2]-> 回溯 (pop 2)。
    • 回溯 (pop 1)。

(最终结果:[],[2],[1],[1, 2])

http://www.jsqmd.com/news/397910/

相关文章:

  • 对于投稿的那些事,心态的变化由开始“激动”到“平常心”的变化过程
  • Java SpringBoot+Vue3+MyBatis it职业生涯规划系统系统源码|前后端分离+MySQL数据库
  • 基于SpringBoot+Vue的.社区疫情管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 企业级.计算机学习系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 2026年临沂干洗行业优质品牌综合评测 - 2026年企业推荐榜
  • 2026年湖南企业如何选择靠谱的循环水药剂品牌? - 2026年企业推荐榜
  • 【毕业设计】SpringBoot+Vue+MySQL it职业生涯规划系统平台源码+数据库+论文+部署文档
  • 2026年南阳招标代理服务商综合评估与精选推荐 - 2026年企业推荐榜
  • 【毕业设计】SpringBoot+Vue+MySQL web新能源充电系统平台源码+数据库+论文+部署文档
  • 2026年湖南循环水药剂服务商综合评测与选型指南 - 2026年企业推荐榜
  • 前后端分离.计算机学习系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 企业级“共享书角”图书借还管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 前后端分离.仓库管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 2026年初环戊烷发泡机优质供应商综合评估报告 - 2026年企业推荐榜
  • 【2025最新】基于SpringBoot+Vue的. Web考编论坛网站管理系统源码+MyBatis+MySQL
  • 基于Java+SpringBoot+SSM智能阅读推荐系统(源码+LW+调试文档+讲解等)/智能阅读系统/阅读推荐系统/智能推荐系统/智能阅读服务/智能阅读平台/阅读智能推荐
  • 掌握大数据领域数据预处理,打造高效数据团队
  • 为什么在进行softmax之前需要对attention进行scaled(为什么除以dk的平方根)
  • 第 8 章:M33 领航——引导 A35 加载 U-Boot 与 Linux 内核
  • 基于SpringBoot+Vue的. Web考编论坛网站管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 【2025最新】基于SpringBoot+Vue的“共享书角”图书借还管理系统管理系统源码+MyBatis+MySQL
  • 企业级+智慧养老中心管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 2026年驻马店玉米种子直销厂家综合实力评估报告 - 2026年企业推荐榜
  • 花生种植户必看:2026年驻马店优质种子服务商综合盘点 - 2026年企业推荐榜
  • 驻马店复合肥厂家深度测评:2026年如何科学选择优质农资伙伴 - 2026年企业推荐榜
  • 树形动态规划——# P2014 [CTSC1997] 选课
  • 杭州优质男款内衣工厂盘点:五家实力厂商解析 - 2026年企业推荐榜
  • 5G时代下传感器大数据的挑战与机遇
  • 深度剖析Claude在AI原生应用领域的价值
  • 2026年Q1组合健身器材实力厂商全景解析与推荐 - 2026年企业推荐榜