应对笔试手写代码,如何准备深度优先算法 广度优先算法?
应对笔试手写代码,如何准备深度优先算法 & 广度优先算法?
- 1. 什么是深度优先算法?什么又是广度优先算法?
- 2. 广度优先算法使用场景
- 3. 广度优先算法模板
- 4. 深度优先算法使用场景
- 5. 深度优先算法模板
- 6. BFS 和 DFS 的复杂度
- 7. BFS 和 DFS 实现方式
1. 什么是深度优先算法?什么又是广度优先算法?
这么高大上的名字,听起来是不是一脸懵逼,别着急,我给大家举一个通俗的例子,不知道大家有没有看过《小蝌蚪找妈妈》的故事,现在我就用这个例子给大家解释。
下面我画的图优点丑,不过可以凑合看。
上面小蝌蚪在0号位置,它想找他的母亲可能出现在最后一层,那么小蝌蚪可以怎么走呢?
如果是按照广度优先搜索,小蝌蚪可以按照每一层找路径,最后,查找的结果就是#0#1#2#3#4#5…
如果是按照深度优先搜索,小蝌蚪可以按照一条路线走到底,走完后再返回原来的分叉点,选择别的路继续走,直到走完。查找的结果是#0#2#6#14#13#5#12#11#1#4#10…
(ps:深度优先算法也叫做DFS,广度优先算法也叫做BFS)
2. 广度优先算法使用场景
1、连通块问题
包括图、树、二维数组(矩阵)等等,即通过一个点扩散,找到一整个连通块。
2、层次遍历
给你一棵树,按每一层输出。
给你一个简单图(无方向、无权重),求最短路径。(其实和树的遍历是一样的,只不过图可能会遍历到重复节点,我们只需要每次去重即可,最后取最先到达目标节点时的层数即可)。
3、拓扑排序
给你一个当方向的图,求出他的拓扑排序,或者问是否有拓扑排序,或者求拓扑排序中最小的,或者问是否唯一(本质是一样的)。经典的问题就是说上某一节课之前需要上另一节课,现在给你若干课程并且有些课需要其他课线上才行,问你应该怎么安排课程。此时你把科目画出来,加上方向,就是拓扑问题了。
3. 广度优先算法模板
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> res = new ArrayList<>();if(root == null){return res;}// 1. 定义队列Queue<TreeNode> queue = new LinkedList<>();// 2.加入初始条件queue.offer(root);// 3. 队列不为空的while循环while(!queue.isEmpty()){List<Integer> oneRes = new ArrayList<>();int n = queue.size();// 3.1 for循环将队列元素逐一取出进行处理for(int i = 0;i < n;++i){TreeNode temp = queue.poll();// 3.0 业务处理oneRes.add(temp.val);// 3.2 将下一条件放入队列中if(temp.left!=null){queue.offer(temp.left);}if(temp.right!=null){queue.offer(temp.right);}}// 3.3 将符合条件的一种结果放入结果集中res.add(oneRes);}// 4. 返回结果集return res;}
}
另外,关于二叉树的序列化和反序列化问题,也可以用广度优先算法来实现,如果题目指定使用哪种方法,广度优先算法序列化会比深度优先算法更直观。
4. 深度优先算法使用场景
1、图或者树的遍历(包括二叉树的遍历、连通图等)(有时候并不是明显的图或者树,而是需要自己手动模拟树或者图)。
2、排列(给定一些元素,返回所有可能的排列)(例如(1、2、3),排列有(123)(132)(213)(231)(312)(321))。
3、组合(给定一些元素,返回所有可能的组合)(例如(1、2、3),组合有(空)(1)(2)(3)(12)(13)(23)(123))。
在操作排列组合的时候,有时候会有重复的元素导致结果重复,除了用 HashSet 去重外,使用选代表的方法更合适,选代表就是选出一个合适的代表,其余重复元素直接忽略。
5. 深度优先算法模板
//模板2
void dfs()//参数用来表示状态
{ if(到达终点状态){ ...//根据题意添加 return; } if(越界或者是不合法状态) return; if(特殊状态)//剪枝return ;for(扩展方式){ if(扩展方式所达到状态合法){ 修改操作;//根据题意来添加 标记; dfs(); (还原标记); //是否还原标记根据题意 //如果加上(还原标记)就是 回溯法 } }
}
6. BFS 和 DFS 的复杂度
时间复杂度都是:O(V+E),V为顶点个数,E为边个数
BFS 的空间复杂度为队列大小,与宽度有关。
DFS 的空间复杂度为调用递归时的占用空间,与深度有关。
7. BFS 和 DFS 实现方式
BFS 一般是通过队列实现。
DFS 一般是通过递归实现。
应对笔试手写代码,如何准备深度优先算法 广度优先算法?相关推荐
- 手写代码(笔试面试真题)
★★★ 手写代码:实现forEach map filter reduce ★★★ 手写实现一个简易的 Vue Reactive ★★★ 手写代码,监测数组变化,并返回数组长度 ★★★ 手写原生继承,并 ...
- java面笔试_java笔试手写算法面试题大全含答案
java笔试手写算法面试题大全含答案 1.统计一篇英文文章单词个数. public class WordCounting { public static void main(String[] args ...
- IOS纯手写代码支持旋屏
2019独角兽企业重金招聘Python工程师标准>>> 不用ib纯手写代码实现旋屏效果,xcode4.6.3,今天试了一下,可以做到,但是代码量会增加,基本思路是:在 - (void ...
- 揭秘 ClownFish 比手写代码还快的原因
说明:本文的第一版由于反对人数较多(推荐/反对数量是:23 / 17), 我在8月20日删除了博文内容,只留下一段简单的内容. 既然分享技术也引来这么多的反对,那我就不分享了. 如果希望知道我的优化方 ...
- python是如何实现进程池和线程池的_高并发:线程、线程锁与线程池(精华),手写代码实现线程池...
前文: 单线程--多线程的开启--线程锁--线程同步工具--手写连接池--连接池工具类. 一.线程 1.线程的概念 2.线程与进程的关系 3.定义: 区别:如上!!! 4.wait()和sleep() ...
- python在哪里写代码比较适合-程序员面试被要求手写代码,你与顶级程序员的差别在哪?...
原标题:程序员面试被要求手写代码,你与顶级程序员的差别在哪? 前言: Python现在非常火,语法简单而且功能强大,很多同学都想学Python! 所以小的给各位看官们准备了收藏已久的视频教程分享给大家 ...
- 【深度学习】深度学习手写代码汇总(建议收藏,面试用)
这几天一些同学在面试的时候,遇到了一些手写代码的题,因为之前都没有准备到,所以基本上在写的时候都有点蒙. 今天我就把一些常见的考题给大家整理下,这些题也是我之前准备面试的时候整理的,很多的代码都是网上 ...
- 处理自己的数据集_手写代码实现KDD CUP99数据集的数据归一化处理
归一化是数据处理的常用方法之一,目的是消除不同评价指标之间的量纲对数据分析结果的影响,使各指标处于同一数量级,以解决数据指标之间的可比性问题. 目前学术界关于归一化和标准化的概念还不统一,常常会把这两 ...
- 如何手写代码进行页面布局
有的时候,布局文件(例如main.xml)并不是万能的,典型的例子就是你的QQ好友列表,在人数未知的情况下我们是不能通过布局文件写死在布局文件中的,因为它是动态的,所以必须查询数据库然后通过代码来动态 ...
最新文章
- Zuul默认路由规则
- Qt/C++工作笔记-对vector与QVector中erase操作的进一步认识(区别与联系)
- 谷歌浏览器怎么长截图怎么截_Chrome浏览器如何完美实现滚动截图技巧
- flume channel monitor实现源码分析
- Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理)
- 制作网页先写html还是css,制作网页是先学html还是css
- 计算机网络实验2-二层交换机的基本配置(eNSP)
- jsp mysql超市管理_基于WEB的小型超市管理系统的设计与实现(JSP,MySQL)
- 智能手机安全:黑客是如何秘密控制你手机号码
- 搭配-最全的配色方案和色彩搭配
- 第15周-两个二阶二维矩阵相乘
- 实战 | 电感元件定位--Halcon与OpenCV实现详解(附源码)
- C:L1-061 新胖子公式 (10分)
- python 猜词游戏(文本文件、数据库、csv)
- 实验四+049+尤帆贤
- 阿里 替换mysql的数据库_mysql替换数据库
- Java黑皮书课后题第2章:2.16(几何:六边形面积)编写程序,提示用户输入六边形边长,然后显示它的面积
- python查看字符串的编码格式_Python 3 查看字符编码方法
- 输入法-电脑输入法快速打出生僻字+运算
- 数字图像处理之第三章
热门文章
- 怀着忐忑的心情在这里开博啦!
- 滴滴补贴大战熄火;360 核心高管离职;贾跃亭妻子欠14亿成“老赖”| 一周业界事
- 如何在 Linux 中检查我的网卡速度?
- 乘法口诀表python_Python 乘法口诀表
- apktool java环境_apktool更新,JDK升级配置
- ApkTool的安装
- 特斯拉自动驾驶实为弥天大谎!总监实锤造假,牵出一桩华人工程师命案
- cos和acos--余弦和反余弦函数
- AX2012服务器配置--Windows Server 2012 如何实现多个用户远程桌面登陆?
- Prometheus监控案例之blackbox-exporter