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 <= nums[i] <= 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不选当前元素 第二种选择

相关推荐
AbandonForce2 分钟前
C++11:列表初始化||右值和移动语义||引用折叠和完美转发||可变参数模板||lambda表达式||包装器(function bind)
开发语言·数据结构·c++·算法
khalil10206 分钟前
代码随想录算法训练营Day-50 图论02 | 99.岛屿数量-深搜、99.岛屿数量-广搜 、100.岛屿的最大面积
数据结构·c++·算法·leetcode·深度优先·图论
Brilliantwxx7 分钟前
【C++】模版进阶(特化+分离编译+非类型模版参数)
开发语言·数据结构·c++·算法
Black蜡笔小新8 分钟前
自动化AI算法训练服务器DLTM企业级AI模型工作站构筑企业AI自主可控新模式
人工智能·算法·自动化
bnmoel8 分钟前
数据结构深度剖析链表全集:结构实现、分类与底层原理全解析
c语言·数据结构·算法·链表·双向链表
童先生18 分钟前
华为云、阿里云、AWS签名机制详解! AK/SK + HMAC-SHA256 签名鉴权!
算法·阿里云·华为云·云计算
承渊政道19 分钟前
【贪心算法】(经典实战应用解析(二):最⻓递增⼦序列、递增的三元⼦序列、最⻓连续递增序列、买卖股票的最佳时机、买卖股票的最佳时机II)
数据结构·c++·学习·算法·leetcode·贪心算法·哈希算法
li星野22 分钟前
动态规划十题通关:从爬楼梯到编辑距离(Python + C++)
c++·python·学习·算法·动态规划
栈溢出了25 分钟前
GAT(Graph Attention Network)学习笔记
人工智能·深度学习·算法·机器学习
Tutankaaa25 分钟前
学校知识竞赛怎么组织?从班级到年级的进阶方案
经验分享·学习·算法·职场和发展