• Leetcode刷题详解——子集


    1. 题目链接:78. 子集

    2. 题目描述:

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

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

    示例 1:

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

    示例 2:

    输入:nums = [0]
    输出:[[],[0]]
    
    • 1
    • 2

    提示:

    • 1 <= nums.length <= 10
    • -10 <= nums[i] <= 10
    • nums 中的所有元素 互不相同

    3. 解法1:

    3.1 算法思路:

    为了获取nums数组的所有子集,我们需要对数组的每个元素进行选择或不选择的操作,即nums数组一定存在2^(数组长度)个子集。对于查找子集,具可以定义一个数组,来记录当时的状态,并对其进行递归。

    3.2 递归流程:

    1. 递归结束条件:如果当前需要处理的元素下标越界,则记录当前状态并直接返回
    2. 在递归过程中,对于每个元素,我们有两种选择:
      1. 不选择当前元素,直接递归到下一个元素
      2. 选择当前元素,将其添加到数组末尾后递归到下一个元素,然后在递归结束时撤回添加操作
    3. 所有符合条件的状态都将被记录下来,返回即可

    请添加图片描述

    3.3 C++算法代码:

    class Solution {
        vector> ret; // 存储所有子集的结果
        vector path; // 当前路径(即当前子集)
    public:
        vector> subsets(vector& nums) {
            dfs(nums,0); // 从第一个元素开始进行深度优先搜索
            return ret; // 返回所有子集的结果
        }
        void dfs(vector&nums,int pos)
        {
            if(pos==nums.size()) // 如果已经遍历完所有元素
            {
                ret.push_back(path); // 将当前路径(即当前子集)添加到结果中
                return; // 结束当前递归
            }
            // 选
            path.push_back(nums[pos]); // 将当前元素添加到当前路径中
            dfs(nums,pos+1); // 继续向下一层递归,处理下一个元素
            path.pop_back(); // 恢复现场,即移除当前路径中的最后一个元素
            // 不选
            dfs(nums,pos+1); // 继续向下一层递归,处理下一个元素,但不将当前元素添加到当前路径中
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    4. 解法2:

    4.1 算法思路:

    对于每个元素有两种选择:

    1. 不进行任何操作;

    2. 将其添加至当前状态的集合。

      在递归时我们需要保证递归结束时当前的状态与进行递归操作前的状态不变,而当我们在选择进行步骤2进行递归时,当前状态会发生变化,因此我们需要在递归结束时撤回添加操作,即进行回溯

    请添加图片描述

    4.2 C++算法代码:

    class Solution {
        vector> ret; // 存储所有子集的结果
        vector path; // 当前路径(即当前子集)
    public:
        vector> subsets(vector& nums) {
            dfs(nums,0); // 从第一个元素开始进行深度优先搜索
            return ret; // 返回所有子集的结果
        }
        void dfs(vector&nums,int pos)
        {
            ret.push_back(path); // 将当前路径添加到结果中
            for(int i=pos;i
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    小程序源码:社群微群人脉系统-多玩法安装简单
    代码随想录算法训练营第20天|二叉树
    扫雷游戏的递归解法
    使用docker搭建overleaf环境
    距离度量 —— 汉明距离(Hamming Distance)
    互联网大厂知识点整理
    【linux】进程的概念与控制
    低代码开发在人工智能时代的多重前景
    R语言使用DALEX包对h2o包构建的机器学习模型进行解释分析:总结及实战
    【MySQL数据库】基本命令操作及语句总结
  • 原文地址:https://blog.csdn.net/weixin_51799303/article/details/134213145