【面试高频算法解析】算法练习6 广度优先搜索

前言

本专栏旨在通过分类学习算法,使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目,帮助您深度理解每种算法,避免出现刷了很多算法题,还是一知半解的状态


专栏导航

  1. 二分查找
  2. 回溯(Backtracking)
  3. 双指针
  4. 滑动窗口
  5. 深度优先搜索
  6. 广度优先搜索
  7. 贪心算法
  8. 单调队列
  9. 堆(Heap)

算法解析

广度优先搜索(Breadth-First Search,简称 BFS)是一种遍历或搜索树结构或图结构的算法。它从一个节点开始,逐层(层次)遍历节点的邻居,然后是邻居的邻居,以此类推,直到找到所需的解或遍历完所有可达的节点。

BFS 的核心思想是先访问离起始点最近的节点,也就是说,它先宽后深地访问节点,这就是“广度优先”的含义。这种算法一般使用队列数据结构来实现。

以下是 BFS 的基本步骤:

  1. 初始化队列:首先将起始节点放入队列中。

  2. 遍历队列中的节点:只要队列不为空,就从队列的前端取出一个节点,并检查它是否是目标节点。

    • 如果找到目标,根据问题的需要,可以返回结果或继续搜索。
    • 如果不是目标,将该节点的所有未访问的邻居节点加入队列的后端。
  3. 标记已访问节点:为了避免重复访问节点,需要记录已经访问过的节点。可以在节点数据结构中添加一个访问标记,或者使用一个单独的数据结构(如哈希表)来存储已访问节点。

  4. 重复步骤2:继续执行步骤2,直到队列为空或找到目标。

BFS 通常用于解决以下类型的问题:

  • 最短路径问题:在无权图中找到两个节点之间的最短路径。
  • 连通性问题:检查图中的两个节点是否连通,或者图是否完全连通。
  • 层次遍历:层次遍历树结构或图结构(如二叉树的层次遍历)。

以下是一个在无向图中进行 BFS 的 Python 示例:

from collections import dequedef bfs(graph, start, target):visited = set()  # 创建一个集合用于存储已访问的节点queue = deque([start])  # 创建一个队列,并将起始节点加入队列while queue:node = queue.popleft()  # 从队列中取出一个节点if node == target:return True  # 如果该节点是目标,则返回Truevisited.add(node)  # 将该节点标记为已访问for neighbor in graph[node]:if neighbor not in visited:queue.append(neighbor)  # 将所有未访问的邻居加入队列return False  # 队列为空,未找到目标,返回False# 示例图
graph = {'A': ['B', 'C'],'B': ['A', 'D', 'E'],'C': ['A', 'F'],'D': ['B'],'E': ['B', 'F'],'F': ['C', 'E'],
}# 调用 BFS
print(bfs(graph, 'A', 'F'))  # 输出:True

在这个例子中,我们定义了一个图的邻接表表示,并实现了 BFS 算法来找到从节点 ‘A’ 到节点 ‘F’ 的路径是否存在。这个 BFS 实现会返回一个布尔值,标识是否找到了目标节点。


实战练习

省份数量

有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。

省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。

给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。

返回矩阵中 省份 的数量。

示例 1:
请添加图片描述

输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2

示例 2:
请添加图片描述

输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]
输出:3

提示:

  • 1 <= n <= 200
  • n == isConnected.length
  • n == isConnected[i].length
  • isConnected[i][j] 为 1 或 0
  • isConnected[i][i] == 1
  • isConnected[i][j] == isConnected[j][i]

官方题解


二叉树的层序遍历II

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例 1:
请添加图片描述

输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]

示例 2:
输入:root = [1]
输出:[[1]]

示例 3:
输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

官方题解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/323813.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI大模型与低代码开发应用的完美融合

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的快速发展引领了许多创新的应用&#xff0c;而大型AI模型和低代码开发平台是这一进展的两个重要方面。本文将探讨AI大模型与低代码开发应用的关系&#xff0c;以及如何利用它们共同推动技术创新和业务发展。 AI大模型…

Flowable6.8适配人大金仓 达梦

目录 前言 一、Flowable6.8 适配人大金仓 1.引入postgreSQL依赖 2.配置驱动 3.总结 二&#xff0c;Flowable 6.8 适配DMV8 1.引入达梦依赖 2.配置数据库 3.确认liquibase的版本 4.liquibase4.x的适配步骤 4.1 在项目中新建liquibase.database.core 包 4.2 创建Oracl…

如何实现无人机识别功能

无人机识别算法可以基于不同的传感器和技术&#xff0c;结合多种方法进行实现。以下是一些常见的无人机识别算法和技术&#xff1a; 视觉识别&#xff1a; 图像处理&#xff1a; 使用计算机视觉技术对无人机图像进行处理&#xff0c;包括特征提取、目标检测和跟踪等。深度学习&…

【模拟电路】软件Circuit JS

一、模拟电路软件Circuit JS 二、Circuit JS软件配置 三、Circuit JS 软件 常见的快捷键 四、Circuit JS软件基础使用 五、Circuit JS软件使用讲解 欧姆定律电阻的串联和并联电容器的充放电过程电感器和实现理想超导的概念电容阻止电压的突变&#xff0c;电感阻止电流的突变LR…

年度最整洁的海盗3.0版本

在修改海盗3.0客户端源码的时候&#xff0c;一直都存在这样的一个问题&#xff1a; 客户端在某些特定的情况下&#xff0c;会报内存错误导致程序崩溃。 经过调试&#xff0c;发现是那个MindPower3D的dll&#xff0c;在跳转地图等情况下卸载清理内存的时候&#xff0c;会偶发出…

pod进阶版(1)

pod的相关知识 k8s的pad重启策略: Always deployment的yaml文件只能是Always pod的yaml三种模式都可以。 Onfailure:只有异常退出状态码非0才会重启。正常退出不重启。 Never&#xff1a;非正常退出和非正常退出都不重启。 容器的退出了pod才会重启。 pod可以有多个容器&…

Pixi.js的魅力

摘要&#xff1a;官网 Web开发的时代&#xff0c;图形和动画已经成为了吸引用户注意力的重要手段之一。而 Pixi.js 作为一款高效、易用的2D渲染引擎&#xff0c;已经成为了许多开发者的首选~~ 项目中&#xff0c;有一些图像的处理操作&#xff08;3D图&#xff0c;2D图都有&…

DataGrip 数据库备份

一、备份 1、找到需要被备份的数据库demo&#xff0c;右键>Import/Export>Export with mysqldump 2、配置路径 点击run&#xff0c;等待完成 导出成功 二、还原 选择 需要导入的数据库>右键>Import/Export>Restore with ‘mysql’ 点击run&#xff0c;刷…

如何本地搭建DolphinScheduler并无公网ip远程访问管理界面

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

医疗设备产生谐波对配电系统危害有哪些

1.对电网的影响 电网中的谐波会增加系统损耗&#xff0c;使设备发热&#xff0c;影响设备使用寿命。此外当并联的无功补偿电容器容抗与系统感抗匹配时&#xff0c;将发生n次并联谐振&#xff0c;造成电容器组的过电压和过电流。当基波频率为时&#xff0c;谐振频率&#xff0c…

36V到80V降5V1A电源芯片WT6039

36V到80V降5V1A电源芯片WT6039 宽电压12V到90V的降压DC-DC转换器WT6039&#xff0c;功能强大&#xff0c;使用广泛。 WT6039是一款功能非常强大的降压DC-DC转换器芯片&#xff0c;它在12V到90V的宽电压范围内都能正常工作。WT6039不仅具有使能开关控制、参考电源、误差放大器等…

Apache Doris 2.0.2 安装步骤 Centos8

Linux 操作系统版本需求 Linux 系统版本当前系统版本CentOS7.1 及以上CentOS8Ubuntu16.04 及以上- 软件需求 软件版本当前版本Java1.81.8.0_391GCC4.8.2 及以上gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4) 1、查看操作系统版本 方法 1&#xff1a;使用命令行 打开终端或…