【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

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

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

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

相关推荐
爱吃rabbit的mq13 小时前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
(❁´◡`❁)Jimmy(❁´◡`❁)14 小时前
Exgcd 学习笔记
笔记·学习·算法
YYuCChi14 小时前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划
CSDN_RTKLIB14 小时前
【四个场景测试】源文件编码UTF-8 BOM
c++
不能隔夜的咖喱14 小时前
牛客网刷题(2)
java·开发语言·算法
VT.馒头14 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
进击的小头15 小时前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机
肉包_51115 小时前
两个数据库互锁,用全局变量互锁会偶发软件卡死
开发语言·数据库·c++
Trouvaille ~16 小时前
【Linux】UDP Socket编程实战(一):Echo Server从零到一
linux·运维·服务器·网络·c++·websocket·udp
HellowAmy16 小时前
我的C++规范 - 线程池
开发语言·c++·代码规范