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

day153—回溯—子集(LeetCode-78)

题目描述

给你一个整数数组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. 成员变量作用

    • t:临时数组,用于存储当前正在构造的子集(相当于 “路径”);
    • ans:最终结果数组,存储所有生成的子集。
  2. 递归函数dfs逻辑

    • 参数curr:表示当前处理到数组nums的第curr个元素;
    • 终止条件:当curr == nums.size()时,说明所有元素都处理完毕,此时t就是一个完整的子集,将其加入ans后返回;
    • 核心流程(先选后不选):①选当前元素:把nums[curr]加入临时数组t,递归处理下一个元素(curr+1);递归返回后,执行t.pop_back()恢复现场(删掉刚加入的元素,避免影响后续选择);②不选当前元素:直接递归处理下一个元素(curr+1),不对t做任何修改。
  3. 主函数subsets

    • 从第 0 个元素开始调用dfs,启动递归过程;
    • 最终返回存储了所有子集的ans

关键特点

  • 逻辑等价性:和你之前看到的 “先不选、后选” 版本功能完全一致,只是选择顺序相反,最终生成的子集顺序会略有不同(比如nums=[1,2]会生成[[1,2],[1],[2],[]],而非[[],[2],[1],[1,2]]),但都是完整的子集集合;
  • 核心思想:通过 “选(修改t后递归)+ 不选(直接递归)” 的组合,遍历所有可能的元素组合,pop_back是回溯的关键,用于恢复临时数组的状态,保证不同选择分支互不干扰。

总结

  1. 核心思路:递归遍历每个元素,对每个元素执行 “选(加入临时数组)→ 递归 → 恢复 → 不选(直接递归)” 的操作;
  2. 关键操作:t.push_back()(选元素)和t.pop_back()(恢复现场)是实现回溯的核心;
  3. 最终效果:通过递归覆盖所有元素的 “选 / 不选” 组合,最终收集到数组的全部子集。

函数源码:

class Solution { public: vector<int> t; vector<vector<int>> ans; void dfs(int curr,vector<int>& nums){ if(curr==nums.size()){ ans.push_back(t); return ; } t.push_back(nums[curr]); dfs(curr+1,nums); t.pop_back(); dfs(curr+1,nums); } vector<vector<int>> subsets(vector<int>& nums) { dfs(0,nums); return ans; } };
http://www.jsqmd.com/news/269433/

相关文章:

  • Python系列Bug修复|如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘websockets’ 问题
  • Fastapi全面教程:常用 API 串联与实战指南
  • 【图像去噪】基于均值+中值+软硬阙值小波变换图像去噪附Matlab代码
  • 2026 年 1 月环氧地坪漆厂家推荐排行榜,环氧彩砂自流平,防静电/水性/室内/车间/车库环氧地坪漆,专业施工与持久耐磨品质之选 - 企业推荐官【官方】
  • 2026深圳GEO服务商评测指南:技术实力与实战效果双维度解析
  • 完整教程:专题:2025年脑机接口产业蓝皮书:市场规模、专利技术、投融资与临床应用|附40+份报告PDF、数据、可视化模板汇总下载
  • 基于 YOLOv8 的猪只行为智能识别系统实践[目标检测完整源码]
  • 如何解决 Error Get “https://registry-1.docker.io/v2/”: dial tcp xxx.xx.1xx:443: connect: connection time
  • AI 写代码越快越危险?破解“高产低质”困局,这一步至关重要
  • 基于 YOLOv8 的茶叶病害智能识别系统[目标检测完整源码]
  • 别把 Cursor 只当代码补全工具!这样做,让 AI 真正读懂你的项目架构
  • Python系列Bug修复|如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘trio’ 问题
  • 【水果分类】基于计算机视觉和前馈神经网络自动水果分类系统附Matlab代码
  • Python系列Bug修复|如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘aiohttp’ 问题
  • 2026年1月电动搬运车厂家推荐排行榜,四轮电动搬运车,1~10吨电动搬运车,高效搬运解决方案优选指南 - 企业推荐官【官方】
  • 紫金桥跨平台监控组态软件:工业生产的可视化控制平台
  • 跨国企业Cadence许可证全球统一管理方案
  • Petrel的license管理高频技术问题(FAQ)与官方解答
  • AI应用架构师解析AI系统灾备方案设计的优化策略
  • ToB获客新战场:AI推荐如何改写游戏规则
  • 为什么企业明明“上了 ITSM”,业务却依然不知道该找 IT 做什么?
  • iOS 应用加固软件怎么选,从源码到IPA方案选择
  • 2026.1.17 作业 - P4141 消失之物
  • ClickHouse与Impala对比:SQL-on-Hadoop方案选择
  • PLC 原理入门教程:从基础概念到实际应用,零基础也能看懂
  • 2026企业AI数字资产管理平台评测:谁在定义下一代无形资产?
  • Windows实用小工具,吾爱出品
  • 如何判断组态软件是否好用?跨越传统标准,开启工业智能新视野
  • 测试Intern-S1-MO
  • 每个人都能用的 AI 神器:教你用“即梦4”和“Sora-2”做大片