【Hot 100 刷题计划】 LeetCode 78. 子集 | C++ 回溯算法题解

LeetCode 78. 子集 | C++ 回溯算法(选或不选)题解

📌 题目描述

题目级别:中等

给你一个整数数组 nums ,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。

解集不能 包含重复的子集。你可以按任意顺序返回解集。

  • 示例
    输入:nums = [1,2,3]
    输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

💡 解题思路:回溯算法(选或不选视角)

求一个集合的子集,本质上是在回答一个问题:对于集合中的每一个元素,我是把它放进子集里,还是不放进去?

这就形成了一棵非常规整的满二叉树 决策过程。假设数组长度为 NNN,我们需要做 NNN 次决策。

nums = [1, 2, 3] 为例:

  1. 面对 1:选它,或者不选它。(2 种状态)
  2. 面对 2:选它,或者不选它。(2 种状态)
  3. 面对 3:选它,或者不选它。(2 种状态)

当我们对所有元素都做完决定(即递归深度达到 NNN),我们就得到了一个确定的子集。把所有的叶子节点收集起来,就是完整的幂集!

核心代码逻辑拆解

  • 不选当前元素 :直接进入下一层递归 dfs(nums, u + 1);。此时 tmp 数组保持原样。
  • 选当前元素 :先把它加进来 tmp.push_back(nums[u]);,然后再进入下一层递归 dfs(nums, u + 1);
  • 撤销选择(回溯) :从下一层递归回来后,必须把刚才加进来的元素踢出去 tmp.pop_back();,恢复现场,以便去尝试其他的分支。

💻 C++ 代码实现

cpp 复制代码
class Solution {
public:
    int n;
    vector<vector<int>> res; // 存放所有的子集
    vector<int> tmp;         // 存放当前正在构建的子集

    vector<vector<int>> subsets(vector<int>& nums) {
        dfs(nums, 0);
        return res;
    }

    // u 表示当前正在对 nums[u] 做"选或不选"的决策
    void dfs(vector<int>& nums, int u) {
        // 1. 递归终止条件:已经对所有元素做完了决策
        if (u == nums.size()) {
            res.push_back(tmp); // 将当前构建好的子集加入结果集
            return;
        }

        // 2. 决策分支一:【不选】当前的数字 nums[u]
        // 直接跳过当前数字,去考察下一个数字
        dfs(nums, u + 1);

        // 3. 决策分支二:【选】当前的数字 nums[u]
        tmp.push_back(nums[u]); // 记录选择
        dfs(nums, u + 1);       // 带着这个选择去考察下一个数字
        
        // 4. 回溯:撤销选择,恢复现场
        tmp.pop_back();
    }
};
相关推荐
大雨淅淅3 分钟前
【机器人】ROS2 机械臂控制(MoveIt2)从入门到实战
人工智能·python·神经网络·学习·算法·机器学习·机器人
Shadow(⊙o⊙)9 分钟前
进程间通信0.0-pipe()匿名管道,详细分析进程池调度队列执行逻辑,进程池模拟实现。
linux·运维·服务器·开发语言·c++
lcj251112 分钟前
【list】【手撕 STL】List 容器全解析!迭代器 / 增删改查 / 去重排序,面试必背的核心考点!
c++·面试·list
指尖的爷16 分钟前
C++头文件的作用
开发语言·c++
智者知已应修善业33 分钟前
【51单片机0.1秒计时到21.0时点亮LED】2024-1-5
c++·经验分享·笔记·算法·51单片机
apcipot_rain36 分钟前
计科八股20260606——二叉树、PCA、图深度学习、进程上下文、C语言预编译、文件读写、单精度浮点数
c语言·数据结构·算法·pca·图神经网络
scx_link39 分钟前
逻辑回归的总结
算法·机器学习·逻辑回归
zh路西法40 分钟前
【rosbridge-websocket】跨网络的ROS1与ROS2通讯法(上)
linux·网络·c++·python·websocket·网络协议
j7~43 分钟前
【C++】类和对象(下)--详解之再探构造函数,友元,static成员,类型转换等
开发语言·c++·类型转换·友元·匿名对象·内部类·编译器优化
稷下元歌44 分钟前
7天学会plc加机器视觉关于运动控制部份,配套视频在bib
开发语言·c++·git·vscode·python·docker·pip