应对笔试手写代码,如何准备深度优先算法 & 广度优先算法?

  • 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 一般是通过递归实现。

应对笔试手写代码,如何准备深度优先算法 广度优先算法?相关推荐

  1. 手写代码(笔试面试真题)

    ★★★ 手写代码:实现forEach map filter reduce ★★★ 手写实现一个简易的 Vue Reactive ★★★ 手写代码,监测数组变化,并返回数组长度 ★★★ 手写原生继承,并 ...

  2. java面笔试_java笔试手写算法面试题大全含答案

    java笔试手写算法面试题大全含答案 1.统计一篇英文文章单词个数. public class WordCounting { public static void main(String[] args ...

  3. IOS纯手写代码支持旋屏

    2019独角兽企业重金招聘Python工程师标准>>> 不用ib纯手写代码实现旋屏效果,xcode4.6.3,今天试了一下,可以做到,但是代码量会增加,基本思路是:在 - (void ...

  4. 揭秘 ClownFish 比手写代码还快的原因

    说明:本文的第一版由于反对人数较多(推荐/反对数量是:23 / 17), 我在8月20日删除了博文内容,只留下一段简单的内容. 既然分享技术也引来这么多的反对,那我就不分享了. 如果希望知道我的优化方 ...

  5. python是如何实现进程池和线程池的_高并发:线程、线程锁与线程池(精华),手写代码实现线程池...

    前文: 单线程--多线程的开启--线程锁--线程同步工具--手写连接池--连接池工具类. 一.线程 1.线程的概念 2.线程与进程的关系 3.定义: 区别:如上!!! 4.wait()和sleep() ...

  6. python在哪里写代码比较适合-程序员面试被要求手写代码,你与顶级程序员的差别在哪?...

    原标题:程序员面试被要求手写代码,你与顶级程序员的差别在哪? 前言: Python现在非常火,语法简单而且功能强大,很多同学都想学Python! 所以小的给各位看官们准备了收藏已久的视频教程分享给大家 ...

  7. 【深度学习】深度学习手写代码汇总(建议收藏,面试用)

    这几天一些同学在面试的时候,遇到了一些手写代码的题,因为之前都没有准备到,所以基本上在写的时候都有点蒙. 今天我就把一些常见的考题给大家整理下,这些题也是我之前准备面试的时候整理的,很多的代码都是网上 ...

  8. 处理自己的数据集_手写代码实现KDD CUP99数据集的数据归一化处理

    归一化是数据处理的常用方法之一,目的是消除不同评价指标之间的量纲对数据分析结果的影响,使各指标处于同一数量级,以解决数据指标之间的可比性问题. 目前学术界关于归一化和标准化的概念还不统一,常常会把这两 ...

  9. 如何手写代码进行页面布局

    有的时候,布局文件(例如main.xml)并不是万能的,典型的例子就是你的QQ好友列表,在人数未知的情况下我们是不能通过布局文件写死在布局文件中的,因为它是动态的,所以必须查询数据库然后通过代码来动态 ...

最新文章

  1. Zuul默认路由规则
  2. Qt/C++工作笔记-对vector与QVector中erase操作的进一步认识(区别与联系)
  3. 谷歌浏览器怎么长截图怎么截_Chrome浏览器如何完美实现滚动截图技巧
  4. flume channel monitor实现源码分析
  5. Spark Shuffle 堆外内存溢出问题与解决(Shuffle通信原理)
  6. 制作网页先写html还是css,制作网页是先学html还是css
  7. 计算机网络实验2-二层交换机的基本配置(eNSP)
  8. jsp mysql超市管理_基于WEB的小型超市管理系统的设计与实现(JSP,MySQL)
  9. 智能手机安全:黑客是如何秘密控制你手机号码
  10. 搭配-最全的配色方案和色彩搭配
  11. 第15周-两个二阶二维矩阵相乘
  12. 实战 | 电感元件定位--Halcon与OpenCV实现详解(附源码)
  13. C:L1-061 新胖子公式 (10分)
  14. python 猜词游戏(文本文件、数据库、csv)
  15. 实验四+049+尤帆贤
  16. 阿里 替换mysql的数据库_mysql替换数据库
  17. Java黑皮书课后题第2章:2.16(几何:六边形面积)编写程序,提示用户输入六边形边长,然后显示它的面积
  18. python查看字符串的编码格式_Python 3 查看字符编码方法
  19. 输入法-电脑输入法快速打出生僻字+运算
  20. 数字图像处理之第三章

热门文章

  1. 怀着忐忑的心情在这里开博啦!
  2. 滴滴补贴大战熄火;360 核心高管离职;贾跃亭妻子欠14亿成“老赖”| 一周业界事
  3. 如何在 Linux 中检查我的网卡速度?
  4. 乘法口诀表python_Python 乘法口诀表
  5. apktool java环境_apktool更新,JDK升级配置
  6. ApkTool的安装
  7. 特斯拉自动驾驶实为弥天大谎!总监实锤造假,牵出一桩华人工程师命案
  8. cos和acos--余弦和反余弦函数
  9. AX2012服务器配置--Windows Server 2012 如何实现多个用户远程桌面登陆?
  10. Prometheus监控案例之blackbox-exporter