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;
    }
};
相关推荐
没头脑的男大13 分钟前
关于删除列表的那些事儿
算法
Book思议-22 分钟前
【数据结构实战】线性表的应用
c语言·数据结构·算法·链表
qq_4614893324 分钟前
C++与Qt图形开发
开发语言·c++·算法
Yzzz-F41 分钟前
Problem - 2194E - Codeforces
算法
像污秽一样41 分钟前
算法设计与分析-习题12.2
算法·迭代改进·分支界限
x_xbx1 小时前
LeetCode:83. 删除排序链表中的重复元素
算法·leetcode·链表
_小草鱼_1 小时前
【搜索与图论】DFS算法(深度优先搜索)
算法·深度优先·图论·回溯·递归
I_LPL2 小时前
hot100 栈专题
算法·
2401_879503412 小时前
C++中的观察者模式变体
开发语言·c++·算法
阿贵---2 小时前
C++中的备忘录模式
开发语言·c++·算法