dfs专题8——子集

dfs专题8——子集
示例图

🔥近津薪荼: [个人主页]🎬个人专栏: 《近津薪荼的算法日迹》《Linux操作系统及网络基础知识分享》《c++基础知识详解》《c语言基础知识详解》✨不要物化,矮化,弱化,钝化自己,保持锋芒,不要停止学习这个世界上只有两个人真正在注意着你八岁的你,和八十岁的你,他们此刻正在注视着你,一个希望你 勇敢开始,一个希望你 不留遗憾


1.上期参考代码

classSolution{ vector<vector<int>>ret; vector<int>path; vector<bool>check=vector<bool>(6,false);public: vector<vector<int>>permute(vector<int>& nums){dfs(nums);return ret;}voiddfs(vector<int>& nums){if(path.size()==nums.size()){ ret.push_back(path);return;}for(int i=0;i<nums.size();i++){if(check[i]==false){ path.push_back(nums[i]); check[i]=true;dfs(nums);//回溯 check[i]=false; path.pop_back();}}}};

2.本期知识点导图

3.本期要讲解的题目是

子集

要点:

  • nums元素各异
  • 返回空集

4.解题

本题我们可以画出两种决策树

4.1决策树1

高中,我们学集合的时候知道,一个集合的子集个数为2n个,这个2n怎么来的?

在一个元素对于集合来说,只有两种情况:存在或者不存在

对于每一个元素进行存在或者不存正在的划分,我们可以得出以下的决策图:

我们发现决策树的结果完全符合我们的期望,所以这就是一个好的决策树。

有了决策树,根据其写代码就方便多啦~

根据决策树,我们得出需要

两个全局变量:

  • 上一级已经存放了的元素–>变量path(也可以设置成函数参数,避免返回现场操作)
  • 存放path的二维数组用于返回所有结果–>ret

父子层信息传递需要:

  • 数组–>nums
  • 这一层是对数组中第几个元素进行判断–>pos

代码逻辑

观察我们想要的结果,都是在叶子结点,很明显,

出口在叶子节点

重复子问题:对于每个元素根据其是否存在,分两种情况讨论
子问题干啥:存在则将其放入path中,进入下一层,不存在啥也不做,进入下一层

4.2决策树2

我们也可以根据,子集中元素的个数,来画决策图:

这张决策图同样需要全局变量path和ret,它也能获得我们想要的结果,也是一个好的决策图。

由于子集种没有排序,只有组合,所以我们要对重复的子集进行剪枝,如图中所示:按照顺序来给path添加元素

提示:
结合for循环,不用设置return出口,for循环能实现数组递归中的按下标顺序添加元素,进行剪枝,出口的本质是:“没有可选择元素”

不知道大家有没有发现,数组往往是多叉树的遍历,多叉树的遍历必然用到for,而for往往是遍历到最后,也就不需要设置return出口~

5.下期要讲解的题目是:

找出所有子集的异或总和再求和

6.嗟食

如果小编写的内容对佬有帮助,还请大佬点点三连加关注哦

在这里插入图片描述


佬的支持就是我前进的最大动力~

期待与佬的再次相遇~

Read more

【数据结构】排序详解:从快速排序分区逻辑,到携手冒泡排序的算法效率深度评测

【数据结构】排序详解:从快速排序分区逻辑,到携手冒泡排序的算法效率深度评测

🔥@晨非辰Tong: 个人主页 👀专栏:《C语言》、《数据结构与算法入门指南》 💪学习阶段:C语言、数据结构与算法初学者 ⏳“人理解迭代,神理解递归。” 文章目录 * 引言 * 一、介绍交换排序 * 二、高效交换--快速排序“:递归版 * 2.1 介绍:创造背景以及基本思想 * 2.2 基于二叉树结构的主体框架 * 三、找基准值key的三种==递归版==实战方法 * 3.1 快排核心构成:寻找key的算法之"hoare"版本 * 3.3.1 画图理解算法 * 3.3.2 代码实战 * 3.1.3 ==**代码分析**== * 3.2

By Ne0inhk
【优选算法必刷100题】第019~20题(二分查找算法):x 的平方根、搜索插入位置

【优选算法必刷100题】第019~20题(二分查找算法):x 的平方根、搜索插入位置

🔥艾莉丝努力练剑:个人主页 ❄专栏传送门:《C语言》、《数据结构与算法》、C/C++干货分享&学习过程记录、Linux操作系统编程详解、笔试/面试常见算法:从基础到进阶 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬艾莉丝的简介: 🎬艾莉丝的算法专栏简介: 目录 019  x 的平方根 1.1  思路一:暴力解法 1.1.1  算法思路 1.1.2  算法实现 1.2  思路二:二分查找 1.2.1  算法思路 1.2.2  算法实现 1.3

By Ne0inhk
HDFS数据块机制深度解析:块大小设计与存储哲学

HDFS数据块机制深度解析:块大小设计与存储哲学

HDFS数据块机制深度解析:块大小设计与存储哲学 * 引言:块——HDFS存储的核心抽象 * 一、HDFS默认块大小 * 1.1 版本演进与默认值 * 1.2 查看和验证块大小 * 1.3 配置文件中的设置 * 二、为什么HDFS采用块存储? * 2.1 核心设计思想 * 2.2 详细解析:为什么块存储如此重要? * **2.2.1 减少寻址开销,提升I/O效率** * **2.2.2 支持超大文件,超越单机限制** * **2.2.3 简化存储设计,降低元数据复杂度** * **2.2.4 便于数据复制,增强容错性** * **2.2.5 支持数据本地性,

By Ne0inhk
【算法通关指南:数据结构与算法篇】二叉树相关算法题:1.二叉树深度 2.求先序排列

【算法通关指南:数据结构与算法篇】二叉树相关算法题:1.二叉树深度 2.求先序排列

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人方向学习者 ❄️个人专栏:《算法通关指南》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、二叉树深度 * 2.1题目 * 2.2 算法原理 * 2.3代码 * 二、 求先序排列 * 3.1题目 * 3.2 算法原理 * 3.3代码 * 总结与每日励志 前言 本专栏聚焦算法题实战,系统讲解算法模块:以《c++编程》,《数据结构和算法》《基础算法》《算法实战》 等几个板块以题带点,讲解思路与代码实现,帮助大家快速提升代码能力ps:本章节题目分两部分,比较基础笔者只附上代码供大家参考,其他的笔者会附上自己的思考和讲解,希望和大家一起努力见证自己的算法成长 一、二叉树深度 2.

By Ne0inhk