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. 最终效果:通过递归覆盖所有元素的 "选 / 不选" 组合,最终收集到数组的全部子集。

函数源码:

cpp 复制代码
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;
    }
};
相关推荐
MicroTech20252 小时前
突破C2Q瓶颈,MLGO微算法科技高性能可重构计算机实现量子算法真实级仿真,推动量子仿真进入新阶段
科技·算法·重构
乌萨奇也要立志学C++2 小时前
【洛谷】搜索初识 回溯剪枝 + 三大枚举题型 + 全排列实现
算法·剪枝
企业对冲系统官2 小时前
期货套保系统移动端操作的技术架构与实现
算法·架构·区块链·github
wen__xvn2 小时前
代码随想录算法训练营DAY20第六章 二叉树part07
数据结构·算法·leetcode
夜思红尘2 小时前
算法--双指针2
算法
Takoony2 小时前
一鱼两吃:为什么 SFT 和 GRPO 可以共用同一批数据
算法
Deepoch2 小时前
Deepoc数学大模型:通信行业智能化的算法引擎
人工智能·算法·数学建模·开发板·通信·具身模型·deepoc
无风听海2 小时前
CBOW输入层向量形式深入解析
人工智能·算法·机器学习
ValhallaCoder2 小时前
Day50-图论
数据结构·python·算法·图论