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不选当前元素 第二种选择

相关推荐
6Hzlia8 小时前
【Hot 100 刷题计划】 LeetCode 739. 每日温度 | C++ 逆序单调栈
c++·算法·leetcode
良木生香9 小时前
【C++初阶】:STL——String从入门到应用完全指南(1)
c语言·开发语言·数据结构·c++·算法
XWalnut9 小时前
LeetCode刷题 day16
数据结构·算法·leetcode·链表·动态规划
foundbug99911 小时前
基于混合整数规划的电池容量优化 - MATLAB实现
数据结构·算法·matlab
memcpy012 小时前
LeetCode 2452. 距离字典两次编辑以内的单词【暴力;字典树】中等
算法·leetcode·职场和发展
王老师青少年编程12 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:魔法
c++·算法·贪心·csp·信奥赛·排序贪心·魔法
wearegogog12312 小时前
基于和差波束法的单脉冲测角MATLAB实现
人工智能·算法·matlab
AI科技星12 小时前
灵魂商数(SQ) · 全域数学统一定义【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
晓觉儿13 小时前
【GPLT】2026年第十一届团队程序设计天梯赛赛后题解(已写2h,存档中)
数据结构·c++·算法·深度优先·图论