【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

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

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

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

相关推荐
Elendill18 分钟前
【算法笔记】并查集详解
笔记·python·算法
oioihoii24 分钟前
C++23新特性:显式对象形参与显式对象成员函数
开发语言·c++·c++23
埜玊38 分钟前
this指针 和 类的继承
c++
BanyeBirth42 分钟前
C++高精度算法(加、减、乘)
开发语言·c++·算法
houliabc42 分钟前
C语言个人笔记
c语言·数据结构·笔记·算法
Allen Wurlitzer1 小时前
算法刷题记录——LeetCode篇(1.9) [第81~90题](持续更新)
算法·leetcode·职场和发展
@MrLiu1 小时前
# 深度学习中的优化算法详解
人工智能·深度学习·算法·优化器
小王努力学编程1 小时前
【Linux网络编程】UDP Echo Server的实现
linux·运维·服务器·网络·c++·学习·udp
阳洞洞1 小时前
leetcode 377. Combination Sum IV
算法·leetcode·动态规划·完全背包问题
双叶8361 小时前
(51单片机)串口通讯(串口通讯教程)(串口接收发送教程)
c语言·开发语言·c++·单片机·嵌入式硬件·microsoft·51单片机