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

相关推荐
伊玛目的门徒31 分钟前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
Jerry1 小时前
LeetCode 226. 翻转二叉树
算法
想做小南娘,发现自己是女生喵2 小时前
【无标题】
数据结构·算法
Kx_Triumphs4 小时前
HDU4348 To the moon(主席树区间修改模板)
算法·题解
旖-旎4 小时前
《LeetCode647 回文子串 || LeetCode 5 最长回文子串》
c++·算法·leetcode·动态规划·哈希算法
轻颂呀5 小时前
约瑟夫环问题
算法
科技大视界7 小时前
投资AI项目,传统尽调不够用了——李章虎律师拆解算法、数据、算力三大雷区
人工智能·算法·数据挖掘
郝学胜-神的一滴7 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
Irissgwe7 小时前
算法滑动窗口
数据结构·算法