78. 子集

文章目录

题目

回溯:78. 子集

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

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

示例 1:

输入:nums = 1,2,3

输出:\[,1,2,1,2,3,1,3,2,3,1,2,3]

示例 2:

输入:nums = 0

输出:\[,0]

提示:

1 <= nums.length <= 10

-10 <= numsi <= 10

nums 中的所有元素 互不相同

代码

cpp 复制代码
class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
            vector<int>tmp;
            vector<vector<int>>res;
            dfs(nums,0,tmp,res);
            return res;
    }
      void dfs(vector<int>&nums,int path_len,vector<int>&tmp,vector<vector<int>>&res){
            if(path_len==nums.size()){
                res.push_back(tmp);
                return ;
            }
            tmp.push_back(nums[path_len]);
            dfs(nums,path_len+1,tmp,res);//递归
            tmp.pop_back();//递归结束
            dfs(nums,path_len+1,tmp,res);
        }
};

原理图

原理解释

提示:算法流程及解释在代码中已标注

方法:通过决策树进行穷举

原始问题可以划分为子问题,叫做递归。同时又有状态的改变,这种有状态改变的递归叫做回溯。

注意:

回溯法 = 带 "撤销选择" 的深度优先搜索

回溯一定是 DFS

DFS 不一定是回溯

1、边界条件:搜索路径的长度等于数组长度,就说明搜索完一条路径找到了一个子集,存储到结果数组中,接着往上回溯搜素下一条路径(return)

2、把当前路径长度对应的数组保存到tmp数组中

3、接着递归下去

4、递归结束需要恢复tmp状态,tmp状态就是对应了每个节点的状态

两个dfs:第一个 pushback +dfs选择当前元素 第一种选择

第二个dfs不选当前元素 第二种选择

相关推荐
sali-tec21 小时前
C# 基于OpenCv的视觉工作流-章81-弯脚检测
图像处理·人工智能·opencv·算法·计算机视觉
kkeeper~21 小时前
0基础C语言积跬步之自定义类型联合和枚举
c语言·开发语言·算法
昵称好难啊21 小时前
4.OpenClaw源码解析_路由的概念
人工智能·算法
Bingorl21 小时前
机器学习之KNN算法
人工智能·算法·机器学习
muddjsv21 小时前
《算法导论》入门学习路径:从零基础到系统掌握
学习·算法
KaMeidebaby21 小时前
卡梅德生物技术快报|组蛋白乙酰化修饰调控动脉粥样硬化的分子机制及中药表观干预研究
网络·人工智能·网络协议·tcp/ip·算法
Fms_Sa21 小时前
分治法—最大子段问题
算法·c#
Galerkin码农选手21 小时前
awq_marlin和gptq_marlin量化算法简要介绍
算法
buhuizhiyuci21 小时前
【算法篇】动态规划——斐波那契数列模型
算法·动态规划
棱镜研途21 小时前
学习笔记丨模式识别与机器学习5大核心赛道解析(IC-IPPR 2026)
人工智能·神经网络·算法·机器学习·模式识别·学术会议·智能计算