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;
    }
};
相关推荐
码农幻想梦14 小时前
821. 跳台阶
递归
墨有66614 小时前
哈希表从入门到实现,一篇吃透!
数据结构·算法·哈希算法
We་ct14 小时前
LeetCode 228. 汇总区间:解题思路+代码详解
前端·算法·leetcode·typescript
AIpanda88814 小时前
如何借助AI销冠系统提升数字员工在销售中的成效?
算法
啊阿狸不会拉杆14 小时前
《机器学习导论》第 7 章-聚类
数据结构·人工智能·python·算法·机器学习·数据挖掘·聚类
木非哲14 小时前
机器学习--从“三个臭皮匠”到 XGBoost:揭秘 Boosting 算法的“填坑”艺术
算法·机器学习·boosting
小辉同志14 小时前
437. 路径总和 III
算法·深度优先·广度优先
笨笨阿库娅14 小时前
从零开始的算法基础学习
学习·算法
不想睡觉_14 小时前
优先队列priority_queue
c++·算法
那个村的李富贵1 天前
CANN加速下的AIGC“即时翻译”:AI语音克隆与实时变声实战
人工智能·算法·aigc·cann