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

相关推荐
月华路2 小时前
G1 GC 对数组与大对象(Humongous)的处理
java·jvm·算法
我想走路带风2 小时前
LRU和最长前缀和(计算机网络算法)
计算机网络·算法
M78佐菲2 小时前
Linux学习笔记:进程
linux·笔记·学习·算法
徐小夕4 小时前
表格、文档、甘特、大屏、表单一站打通:pxcharts超级表格4.0正式上线!
前端·算法·github
Xin7704 小时前
LeetCode 23.合并 K 个升序链表(分治递归)
leetcode
TechLee5 小时前
跨语言加解密总对不上?这个纯 Go 神库让 AES/RSA 与 PHP、Java 100% 互通
java·后端·算法
月华路6 小时前
G1 新生代对象晋升老年代:实现机制与 GC 日志
java·jvm·算法
万法若空7 小时前
排列组合恒等式
c++·算法
Nil2087 小时前
leetcode 105从前序和中序遍历序列构造二叉树
算法·leetcode·职场和发展
一直C7 小时前
【数据结构】哈希表+算法复杂度与经典排序查找(C语言)
java·linux·开发语言·数据结构·算法·ubuntu·散列表