【leetcode】逐层探索:BFS求解最短路的原理与实践

article/2025/8/15 3:28:06

前言

🌟🌟本期讲解关于力扣的几篇题解的详细介绍~~~

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

🔥 你的点赞就是小编不断更新的最大动力                                       

🎆那么废话不多说直接开整吧~~

目录

📚️1.BFS如何解决最短路问题

📚️2.迷宫中离入口最近的出口

🚀2.1题目描述

🚀2.2题目解析

🚀2.3题目代码

📚️3.最小基因变化

🚀3.1题目描述

🚀3.2题目分析

🚀3.3题目代码

📚️4.总结

📚️1.BFS如何解决最短路问题

在解决下面几道题之前,小编要展开讲讲为啥我们的BFS宽度优先遍历可以解决这里的最短路问题,我们在之前已经了解到,这个的宽度优先遍历BFS的遍历方法如同病毒扩散的方式进行扩散遍历,那么好就是一个关键

且看这张图:

假如说,我们从A到我们的I,那么最短路径就是:

A    C    E     F      I  

注意:BFS只适用于边权为一的情况; 

那么BFS如何进行操作?

首先我们了解到BFS的扩散是一层一层的,那么我们就可以利用这个特性;

假如我们要找A到E的最短路径,那么如下图:

可以看到,我们与A连接的值就是BC两个节点,那么我们可以将BC看做一层,那么我们在以BC为一层,进行扩散,那么就会得到下一层就是DE,那么此时这一层就包含我们的目标节点,那么就可以知道我们到达E节点的步数了~~~

那么基于上述,我们重A到目标点I,的实例如下:

注意我们在遍历的过程中,已经被遍历的节点,那么对应就不能够进行遍历的操作了,那么在一层一层拨开后:

A层       (BC层)         (DE层)           (FG层)

那么这就是我们的BFS解决最短路问题;

📚️2.迷宫中离入口最近的出口

🚀2.1题目描述

给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 '.' 表示)和墙(用 '+' 表示)。同时给你迷宫的入口 entrance ,用 entrance = [entrancerow, entrancecol] 表示你一开始所在格子的行和列。

每一步操作,你可以往  或者  移动一个格子。你不能进入墙所在的格子,你也不能离开迷宫。你的目标是找到离 entrance 最近 的出口。出口 的含义是 maze 边界 上的 空格子entrance 格子 不算 出口。

请你返回从 entrance 到最近出口的最短路径的 步数 ,如果不存在这样的路径,请你返回 -1 。

如下:

就是我们会出生在entrance的地方,然后找到最短的出口,返回我们离这个出口的距离

其中 “+”为墙,不可以触碰,不可以穿过;

🚀2.2题目解析

到这里就很明显了,我们使用BFS的最短路径解决办法,以入口为起点,开始扩散,如果扩散的一层到了边缘,那么就可以进行计算返回最短路径了;

解题思路:

1.创建队列,创建一个参照数组来规定哪些地址我们已经遍历了

2.将我们此时的位置放入队列中,然后此位置标记

3.在队列不可为空的时候,我们要拿出一层的节点来进行扩散操作,所以需要拿到此时队列的长度;

4.条件判断,入队列即可

🚀2.3题目代码

代码如下所示:

class Solution {int[] dx = { 0, 0, 1, -1 };int[] dy = { 1, -1, 0, 0 };public int nearestExit(char[][] maze, int[] entrance) {int m = maze.length;int n = maze[0].length;boolean[][] vis = new boolean[m][n];Queue<int[]> q = new LinkedList<>();q.add(new int[] { entrance[0], entrance[1] });vis[entrance[0]][entrance[1]] = true;int step = 0;while (!q.isEmpty()) {step++;int sz = q.size();for (int i = 0; i < sz; i++) {int[] index = q.poll();int a = index[0];int b = index[1];for (int k = 0; k < 4; k++) {int x = a + dx[k];int y = b + dy[k];if (x >= 0 && x < m && y >= 0 && y < n && vis[x][y] == false && maze[x][y] == '.') {if(x == 0 || x == m - 1 || y == 0 || y == n - 1){return step;}q.add(new int[] { x, y });vis[x][y] = true;}}}}return  -1;}
}

注意:我们在扩散的时候是上下左右四个方向的扩散 ,并且在BFS的时候,我们要将一层的节点拿出来进行扩散,再将这一层扩散的节点作为一下层来进行扩散,这就是为什么我们要计算队列的长度;

📚️3.最小基因变化

🚀3.1题目描述

基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 'A''C''G' 和 'T' 之一。

假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。

  • 例如,"AACCGGTT" --> "AACCGGTA" 就是一次基因变化。

另有一个基因库 bank 记录了所有有效的基因变化,只有基因库中的基因才是有效的基因序列。(变化后的基因必须位于基因库 bank 中)

给你两个基因序列 start 和 end ,以及一个基因库 bank ,请你找出并返回能够使 start 变化为 end 所需的最少变化次数。如果无法完成此基因变化,返回 -1 。

注意:起始基因序列 start 默认是有效的,但是它并不一定会出现在基因库中。

总结:

就是将每个单词进行变化(可以变成A C G T)其中的一个,并且每次变化只要在基因库中存在,那么就是有效的变化,所以要求的就是从一个序列变成另一个序列的最短路径

🚀3.2题目分析

我就以题目的列子来进行举例吧:

如下图所示:

上述就是整个分析过程:

1.我们要对于一个序列上的每一个字符进行替换,在满足存在bank的情况下,将对应的序列进行入队列(作为一层),若不满足那么就不管;

2. 每一次进行替换的时候,都要将同一层的序列进行替换的操作,就是一步;所以这里要利用队列的长度

3.在添加序列进入队列中的时候,也要将对应序列进行记录表示已经出现过了,不能变化回去

4.在满足没有遍历过,并且存在bank中时,添加进入队列后,要判断是否是目标序列,返回我们的步数(一个变量,每次一层搞完后,就加一即可)

🚀3.3题目代码

 代码如下所示:

class Solution {public int minMutation(String startGene, String endGene, String[] bank) {//首先将我们的基因库存入哈希表中Set<String> isBank = new HashSet<>();for (String s : bank) {//判断存在即可isBank.add(s);}if(startGene.equals(endGene)){return 0;}if(!isBank.contains(endGene)){return -1;}Queue<String> q = new LinkedList<>();int step = 0;//定义一个哈希表来判断是否已经遍历过了Map<String, Boolean> vis = new HashMap<>();//两层循环q.add(startGene);vis.put(startGene, true);while (!q.isEmpty()) {step++;int count = q.size();for (int k = 0; k < count; k++) {String str = q.poll();for (int i = 0; i < str.length(); i++) {//进行四次变化for (int j = 0; j < 4; j++) {char ch = 'R';if(j == 0){ch = 'A';}else if(j == 1){ch = 'C';}else if(j == 2){ch = 'G';}else if(j == 3){ch = 'T';}StringBuilder sb = new StringBuilder(str);sb.setCharAt(i, ch);String sb_str = sb.toString();if(isBank.contains(sb_str) && !vis.containsKey(sb_str)){if(sb_str.equals(endGene)){return step;}q.add(sb_str);vis.put(sb_str,true);}}}}}return -1;}
}

其实大体的思路和上面的迷宫题目差不多,就是一层一层进行剥去,这里的核心剥去就是一队列长度为循环条件,直到一层出完,并扩散至另一层后才会开启下一层的扩散~~~

📚️4.总结

本期小编主要讲解了关于BFS如何解决最短路径的问题,其主要思想就是利用BFS进行层层扩散,并一层一层剥离的思想,来决定最短路径

1926. 迷宫中离入口最近的出口 - 力扣(LeetCode)

433. 最小基因变化 - 力扣(LeetCode)

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

😊😊  期待你的关注~~~ 


http://www.hkcw.cn/article/qJYbBqEkxs.shtml

相关文章

七大排序算法深度解析:从原理到代码实现

1.排序 排序算法是计算机科学中最基础的技能之一&#xff0c;无论你是编程新手还是经验丰富的开发者&#xff0c;理解这些算法都能显著提升代码效率。本文将用最简单的方式&#xff0c;带你快速掌握七大经典排序算法的核心原理与实现。 1.1排序概念及其运用 排序是指将一组数据…

Python的情感词典情感分析和情绪计算

一.大连理工中文情感词典 情感分析 (Sentiment Analysis)和情绪分类 (Emotion Classification&#xff09;都是非常重要的文本挖掘手段。情感分析的基本流程如下图所示&#xff0c;通常包括&#xff1a; 自定义爬虫抓取文本信息&#xff1b;使用Jieba工具进行中文分词、词性标…

C++之vector类(超详细)

这节我们来学习一下&#xff0c;C中一个重要的工具——STL&#xff0c;这是C中自带的一个标准库&#xff0c;我们可以直接调用这个库中的函数或者容器&#xff0c;可以使效率大大提升。这节我们介绍STL中的vector。 文章目录 前言 一、标准库类型vector 二、vector的使用 2.…

C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

&#x1f4da; 本文主要总结了一些常见的C面试题&#xff0c;主要涉及到语法基础、STL标准库、内存相关、类相关和其他辅助技能&#xff0c;掌握这些内容&#xff0c;基本上就满足C的岗位技能&#xff08;红色标记为重点内容&#xff09;&#xff0c;欢迎大家前来学习指正&…

『C++成长记』string模拟实现

🔥博客主页:小王又困了 📚系列专栏:C++ 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ ​ 目录 一、存储结构 二、默认成员函数 📒2.1构造函数 📒2.2析构函数 📒2.3拷贝构造 📒2.4赋值重载 三、容量操作 📒3.1获取有效字符长度…

多态的使用和原理(c++详解)

一、多态的概念 多态顾名思义就是多种形态&#xff0c;它分为编译时的多态&#xff08;静态多态&#xff09;和运行时的多态&#xff08;动态多态&#xff09;&#xff0c;编译时多态&#xff08;静态多态&#xff09;就是函数重载&#xff0c;模板等&#xff0c;通过不同的参数…

C++ 底层实现细节隐藏全攻略:从简单到复杂的五种模式

目录标题 1 引言&#xff1a;为什么要“隐藏实现”1.1 头文件暴露带来的三大痛点1.2 ABI 稳定 vs API 兼容&#xff1a;先分清概念1.3 选型三问法——评估你到底要不要隐藏 2 模式一&#xff1a;直接按值成员 —— “裸奔”也能跑2.1 典型写法与最小示例2.2 何时按值最合适&…

使用国内镜像网站在线下载安装Qt(解决官网慢的问题)——Qt

国内镜像网站 中国科学技术大学&#xff1a;http://mirrors.ustc.edu.cn/qtproject/清华大学&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/qt/北京理工大学&#xff1a;http://mirror.bit.edu.cn/qtproject/ 南京大学&#xff1a;https://mirror.nju.edu.cn/qt腾讯镜像&…

超全超详细!JDK 安装及环境配置(Java SE 8 保姆级教程)

一、JDK 简介 JDK&#xff08;Java Development Kit&#xff09;是用于开发 Java 程序的工具包&#xff0c;包括编译器 javac、Java 运行环境&#xff08;JRE&#xff09;以及各种开发工具。安装和配置 JDK 是学习和使用 Java 编程的第一步&#xff0c;以下是 Java 和 JDK 的具…

Java 大视界 -- 基于 Java 的大数据分布式数据库在社交网络数据存储与查询中的架构设计与性能优化(225)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

C++协程从入门到精通

文章目录 一、C协程入门知识&#xff08;一&#xff09;基本概念&#xff08;二&#xff09;特点&#xff08;三&#xff09;应用场景 二、C协程精通知识&#xff08;一&#xff09;高级特性&#xff08;二&#xff09;优化技巧&#xff08;三&#xff09;错误处理机制&#xf…

蓝桥杯第十六届c组c++题目及个人理解

本篇文章只是部分题目的理解&#xff0c;代码和思路仅供参考&#xff0c;切勿当成正确答案&#xff0c;欢迎各位小伙伴在评论区与博主交流&#xff01; 目录 题目&#xff1a;2025 题目解析 核心提取 代码展示 题目&#xff1a;数位倍数 题目解析 核心提取 代码展示 …

C++日新月异的未来代码:C++11(上)

文章目录 1.统一的列表初始化1.1 普通{ }初始化1.2 initializer_list 2.声明2.1 auto、nullptr2.2 decltype 3.左值右值3.1 概念3.2 左值引用与右值引用比较3.3 左值引用与右值引用的应用3.4 完美转发 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xf…

C++从入门到实战(十二)详细讲解C++如何实现内存管理

C从入门到实战&#xff08;十二&#xff09;详细讲解C如何实现内存管理 前言一、C内存管理方式1. new/delete操作内置类型2. 异常与内存管理的联系&#xff08;简单了解&#xff09;3. new和delete操作自定义类型 二、 operator new与operator delete函数&#xff08;重点&…

【2025年最新版】Java JDK安装、环境配置教程 (图文非常详细)

文章目录 【2025年最新版】Java JDK安装、环境配置教程 &#xff08;图文非常详细&#xff09;1. JDK介绍2. 下载 JDK3. 安装 JDK4. 配置环境变量5. 验证安装6. 创建并测试简单的 Java 程序6.1 创建 Java 程序&#xff1a;6.2 编译和运行程序&#xff1a;6.3 在显示或更改文件的…

【Linux系统】从 C 语言文件操作到系统调用的核心原理

文章目录 前言lesson 15_基础IO一、共识原理二、回顾C语言接口2.1 文件的打开操作2.2 文件的读取与写入操作2.3 三个标准输入输出流 三、过渡到系统&#xff0c;认识文件系统调用3.1 open 系统调用1. 比特位标志位示例 3.2 write 系统调用1. 模拟实现 w 选项2. 模拟实现 a 选项…

JavaSwing之--JTextField

JavaSwing之–JTextField JTextField 是一个允许编辑单行文本的轻量级组件&#xff0c;它提供了一系列的构造方法和常用方法用来编写可以存储文本的文本框满足程序功能的需求。 以下在简要介绍常用构造方法、普通方法后详解各种方法的应用及举例。 一、构造方法 方法名称功…

Windows系统之VHD安装

环境准备 工具说明Dism部署系统、提取和转换系统镜像等等&#xff0c;还有很多功能大家可以自行探索。这里只用到Dism的部署系统功能。 Releases Chuyu-Team/Dism-Multi-language GitHubbcdedit.exe自带工具 C:\Windows\System32\bcdedit.exe 创建虚拟磁盘 首先右键点击我…

解决Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field ‘com.sun.tools.javac.tre

问题描述 在更新自建基础项目过程中&#xff0c;compile、install报错。 Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field com.sun.tools.javac.tree.JCTree qualid 解决方案 问题原因是Lombok &#xff0c;与 JDK 21 兼容的最低 Lombok 版本是…

【C++】二叉搜索树 - 从基础概念到代码实现

&#x1f4cc; 个人主页&#xff1a; 孙同学_ &#x1f527; 文章专栏&#xff1a;C &#x1f4a1; 关注我&#xff0c;分享经验&#xff0c;助你少走弯路 文章目录 1. 二叉搜索树的概念2. 二叉搜索树的性能分析3. 二叉搜索树的插入4. 二叉搜素树的查找5. 二叉搜索树的删除6.二…