【Leetcode每日一题】 穷举vs暴搜vs深搜vs回溯vs剪枝_全排列 - 子集(解法2)(难度⭐⭐)(72)

1. 题目解析

题目链接:78. 子集

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

为了生成一个给定数组 nums 的所有子集,我们可以利用一种称为回溯(backtracking)的算法策略。回溯法通过递归的方式,在每一步选择是否将当前元素包含在子集中,并继续处理后续的元素。由于每个元素都可以被选择或不选择,因此总共会产生 2^n 个子集(其中 n 是数组 nums 的长度)。

算法步骤:
  1. 定义递归函数
    • 函数名:dfs(深度优先搜索)
    • 参数:
      • res:存储所有子集的二维向量
      • ans:当前正在构建的子集
      • nums:输入数组
      • step:当前处理的元素下标
    • 返回值:无(函数通过修改参数 res 来返回结果)
  2. 递归结束条件
    • step 等于 nums 的长度时,表示已经处理了数组中的所有元素,此时将 ans 加入到 res 中,并返回。
  3. 递归过程
    • 在每一步,都有两种选择:
      • 不选择当前元素 :保持 ans 不变,递归调用 dfs 函数处理下一个元素(step + 1)。
      • 选择当前元素 :将 nums[step] 添加到 ans 的末尾,然后递归调用 dfs 函数处理下一个元素。在递归返回后,需要从 ans 中移除最后添加的元素(回溯),以确保下一次递归调用时 ans 的状态是正确的。
  4. 结果返回
    • 递归结束后,res 将包含 nums 的所有子集。

3.代码编写

cpp 复制代码
class Solution {
    vector<vector<int>> ret;
    vector<int> path;

public:
    vector<vector<int>> subsets(vector<int>& nums) {

        dfs(nums, 0);
        return ret;
    }
    void dfs(vector<int>& nums, int pos) {
        ret.push_back(path);
        for (int i = pos; i < nums.size(); i++) {
            path.push_back(nums[i]);
            dfs(nums, i + 1);
            path.pop_back(); // 恢复现场
        }
    }
};

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~

相关推荐
GreenTea7 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
码匠许师傅7 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
fqq38 小时前
力扣刷题前置Java语法
算法·leetcode·职场和发展
小小龙学IT9 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
知无不研10 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
半夏微凉半夏殇10 小时前
x11与weston对比,优先选哪个
leetcode·均值算法·eclipse
2501_9065651210 小时前
数学之美探究
算法
oier_Asad.Chen10 小时前
【洛谷题解/AcWing题解/OI学习笔记】洛谷P2868【USACO07DEC】Sightseeing Cows G(01分数规划求最大比率)
算法·图论·spfa·二分·负环
C++ 老炮儿的技术栈12 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
leisoo809712 小时前
财报数据怎么排雷本地化Python构建财务异常预警系统
人工智能·python·算法