【面试高频算法解析】算法练习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.mzph.cn/news/600312.shtml

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

相关文章

开源字符识别 OCR 引擎推荐

Tesseract 开源 OCR 引擎&#xff08;主存储库&#xff09; github地址 https://github.com/tesseract-ocr/tesseract 官方网址 tesseract-ocr.github.io/ Tesseract 是一个开源的光学字符识别&#xff08;OCR&#xff09;引擎&#xff0c;它能够从图像文件中识别和提取文…

Protobuf 安装与使用

Protobuf 安装与使用 1 环境2 安装 [apt安装]2 安装 [源码安装]1 依赖2 下载 protobuf3 解压4 编译安装5 配置环境 2 命令查看版本卸载 3 使用书写 .proto 文件编译 .proto 文件生成 cpp 文件编写 cpp 文件编译运行 参考 1 环境 ubuntn 20.04 protobuf v3.6.1 2 安装 [apt安装…

package-info.java delete

package-info.java delete

监控oracle表空间是否超过80%

先点赞后观看&#xff0c;养成好习惯 1.监控脚本 oracle_cron.sh source /home/oracle/.bash_profile sqlplus -s / as sysdba > /tmp/tablespace.log<<EOF CLEAR COLUMNS BREAKS COMPUTES set lines 134 pages 200 COLUMN STATUS …

如何实现安卓端与苹果端互通的多种方案

随着移动设备用户的爆炸性增长&#xff0c;跨平台应用开发变得尤为重要。在Android与iOS之间实现互通对于推广应用、增加用户覆盖面和提升用户体验有至关重要的作用。以下是实现Android与iOS互通的多种方案&#xff0c;以及每种方案的实现方法、细节注意点、适合团队的规模和建…

普通BUG

IDEA包折叠 如果自动紧凑包名,则有些时候创建新包或类的时候不能达到想要的摆放层级关系,此时右上角搜索按钮搜hide middle,关掉紧凑即可,然后既可以每层一个包不折叠. 效果: 20240105println输出多个参数 int a 10;int b 20;报错println是可以输出多个参数的,但不支持直接用…

CentOS安装Redis7(Alibaba Cloud Linux兼容)

安装Redis7 下载redis的linux版本压缩包 redis-7.0.11.tar.gz 安装gcc编译环境 yum install -y gcc-c解压redis压缩包&#xff0c;并进入 [rootiZ2ze6psmhg970tbycgrbpZ ~]# tar -zxvf redis-7.0.11.tar.gz [rootiZ2ze6psmhg970tbycgrbpZ ~]# cd redis-7.0.11/查看redis源码…

WEB 3D技术 three.js 顶点旋转

我们来说说几何体顶点的旋转 官网搜索 BufferGeometry 这里 我们有 x y z 三个轴的旋转 例如 我们这样的代码 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; i…

vue+springboot项目上传部署tomcat

下载及安装Tomcat 进入tomcat官网&#xff0c;Tomcat官网 选择需要下载的版本&#xff0c;点击下载下载路径一定要记住&#xff0c;并且路径中尽量不要有中文 下载后是压缩包 .zip&#xff0c;解压后 tomcat系统各个文件夹目录是什么意义&#xff1a; bin&#xff1a;放置的是…

【MATLAB】CEEMD_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 CEEMD-LSTM神经网络时序预测算法是一种结合了完全扩展经验模态分解&#xff08;CEEMD&#xff09;和长短期记忆神经网络&#xff08;LSTM&#xff09;的时间序列预测方法。 CEEMD是一种改…

全程云OA ajax.ashx SQL注入漏洞复现

0x01 产品简介 全程云OA为企业提供日常办公管理、公文管理、工作请示、汇报、档案、知识体系、预算控制等26个功能,超过100多个子模块。为企业内部提供高效、畅通的信息渠道,同时也能大力推动公司信息系统发展,提高企业的办公自动化程度和综合管理水平,加快企业信息的流通…

python版本控制-pyenv

前言 日常开发中&#xff0c;我喜欢开发环境比实际运行环境高一个版本。因为这似乎有助于&#xff0c;让程序不断适应高版本的运行环境。 但是&#xff0c;今天遇到一个例外 — python。我系统默认的python版本是3.9&#xff0c;但是CI上的版本是3.6。众所周知&#xff0c;py…

TikTok需要的原生IP是什么?海外独享原生IP地址如何获取?

相信很多做跨境店铺或者TikTok直播的小伙伴都听说过”原生IP”,网络上关于它的判定方法也五花八门&#xff0c;今天小编以自身跨境经验来为大家介绍原生IP是什么?有什么好处&#xff1f;如何获取&#xff0c;感兴趣请继续看下去&#xff01; 一、什么是原生IP/非原生IP? 原生…

OpenCV-16图像的基本变换

一、图像的放大与缩小 1. 对小狗图片进行缩放 使用API----resize&#xff08;src, dsize, [,dst,[fx[,fy[,interpolation]]]]&#xff09; src&#xff1a;要缩放的图像。 dsize&#xff1a;缩放之后的图像大小&#xff0c;元组和列表表示都可以。 dst&#xff1a;可选参数…

Jmeter 性能 —— 电商系统TPS计算

1、怎么计算得出TPS指标 ①第一个通过运维那边给的生产数据&#xff0c;看一下生产进件有多少&#xff0c;计算得来的&#xff0c;如果没有生产数据&#xff0c;或者不过就看如下的方法 ②第二个就是根据最近一个月的实际访问数据&#xff0c;比如每天调用了多少个接口&#…

src refspec master does not match any

新项目推送至 Git 空仓库时抛出如下异常 src refspec master does not match any 初始化 init 都做了但反复尝试 git push -u origin master 均无果 后发现权限不够 .... 起初设置为开发者,后变更为了主程序员再次尝试 push 成功 .... 以上便是此次分享的全部内容&#xff0c;…

支持 input 函数的在线 python 运行环境 - 基于队列

支持 input 函数的在线 python 运行环境 - 基于队列 思路两次用户输入三次用户输入 实现前端使用 vue element uiWindows 环境的执行器子进程需要执行的代码 代码仓库参考 本文提供了一种方式来实现支持 input 函数&#xff0c;即支持用户输的在线 python 运行环境。效果如下图…

什么是谐波减速机?日本Harmonic哈默纳科谐波减速机有哪些优点?

一、什么是谐波减速机&#xff1f; 谐波减速装置最早期被叫做“strain wave gearing”&#xff0c;直译过来为“应变波齿轮”。其后被HarmonicDrive Systems 公司大规模商业实用化后&#xff0c;经过二次翻译后&#xff0c;中文名称才将其称为“谐波齿轮传动”。 谐波减速机是…

Kubernetes(K8s)命令大全

Kubernetes&#xff08;简称K8s&#xff09;是一种开源的容器编排平台&#xff0c;用于自动化应用程序的部署、扩展和管理。通过Kubernetes&#xff0c;您可以轻松地管理容器化应用&#xff0c;实现高可用性、弹性伸缩以及简化的部署和维护。以下是一份Kubernetes常用命令的大全…

数据结构第六弹---带头双向循环链表

双向循环链表 1、带头双向循环链表概念2、带头双向循环链表的优势3、带头双向循环链表的实现3.1、头文件包含和结构定义3.2、创建新结点3.3、打印3.4、初始化3.5、销毁3.6、尾插3.7、头插3.8、头删3.9、尾删3.10、查找3.11、在pos之前插入3.12、删除pos位置3.13、判断是否为空3…