每日OJ题_多源BFS①_力扣542. 01 矩阵(多源BFS解决最短路原理)

2024-04-19 05:44

本文主要是介绍每日OJ题_多源BFS①_力扣542. 01 矩阵(多源BFS解决最短路原理),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

多源BFS解决最短路算法原理

力扣542. 01 矩阵

解析代码


多源BFS解决最短路算法原理

什么是单源最短路 / 多源最短路?

之前的BFS解决最短路都是解决的单源最短路。

画图来说,单源最短路问题即为:

而对于多源最短路问题:

如何解决此类题?

自然是利用多源BFS解决,下面提出解法:

        当我们将所有的源点作为一个源点来进行解题时,问题又变成了单源最短路问题,而为什么可以认为这种解法是正确的呢?

  • 感性的理解 :对于上图的ABC三点,显然A点到目标点的距离更远,当我们将其作为一个点时,A点就会被直接排除,此时该特殊源点实际上就是最近的源点的合并。

对于解法二,如何编写代码?

对于 单源最短路 问题的BFS解法为:

  • 将起始点加入到队列中,再进行一层一层的扩展

自然,对于 多源最短路 的BFS解法为:

  • 将所有的起始点加入到队列中,再进行一层一层的扩展

力扣542. 01 矩阵

542. 01 矩阵

难度 中等

给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。

两个相邻元素间的距离为 1 。

示例 1:

输入:mat = [[0,0,0],[0,1,0],[0,0,0]]
输出:[[0,0,0],[0,1,0],[0,0,0]]

示例 2:

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

提示:

  • m == mat.length
  • n == mat[i].length
  • 1 <= m, n <= 10^4
  • 1 <= m * n <= 10^4
  • mat[i][j] is either 0 or 1.
  • mat 中至少有一个 
class Solution {
public:vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {}
};

解析代码

对于求的最终结果,有两种方式:

  • 第一种方式:从每一个 1 开始,然后通过层序遍历找到离它最近的 0 。这一种方式,会以所有的 1 起点,来一次层序遍历,势必会遍历到很多重复的点。并且如果矩阵中只有一个 0 的话,每一次层序遍历都要遍历很多层,时间复杂度较高。
  • 第二种方式:正难则反,从 0 开始层序遍历,并且记录遍历的层数。当第一次碰到 1 的时候,当前的层数就是这个 1 离 0 的最短距离。

        第二种方式,在遍历的时候标记一下处理过的 1 ,能够做到只用历整个矩阵一次,就能得到最终结果。 但是有一个问题, 0 是有很多个的,怎么才能保证遇到的 1 距离这一个 0 是最近的呢?可以先把所有的 0 都放在队列中,把它们当成一个整体,每次把当前队列里面的所有元素向外扩展一次。可以开一个dist数组就能完成类似前面BFS解决最短路所需的bool数组,step和size变量:初始化成-1的话就是没遍历的,遍历的step只需在前一个格子加1,层数也能确定。

class Solution {int dx[4] = {0, 0, -1, 1};int dy[4] = {1, -1, 0, 0};
public:vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {int m = mat.size(), n = mat[0].size();vector<vector<int>> dist(m, vector<int>(n, -1));queue<pair<int, int>> q;for(int i = 0; i < m; i++) // 把所有的源点加⼊到队列中{for(int j = 0; j < n; j++){if(mat[i][j] == 0){q.push({i, j});dist[i][j] = 0;}}}while(!q.empty()) // ⼀层⼀层往外扩{auto [a, b] = q.front();q.pop();for(int i = 0; i < 4; ++i){int x = a + dx[i], y = b + dy[i];if(x >= 0 && x < m && y >= 0 && y < n && dist[x][y] == -1){dist[x][y] = dist[a][b] + 1;q.push({x, y});}}}return dist;}
};

也可以不开空间直接在原数组操作:

class Solution {int dx[4] = {0, 0, -1, 1};int dy[4] = {1, -1, 0, 0};
public:vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {int m = mat.size(), n = mat[0].size();queue<pair<int, int>> q;for(int i = 0; i < m; i++) // 把所有的源点加⼊到队列中{for(int j = 0; j < n; j++){if(mat[i][j] == 0)q.push({i, j});elsemat[i][j] = -1;}}while(!q.empty()) // ⼀层⼀层往外扩{auto [a, b] = q.front();q.pop();for(int i = 0; i < 4; ++i){int x = a + dx[i], y = b + dy[i];if(x >= 0 && x < m && y >= 0 && y < n && mat[x][y] == -1){mat[x][y] = mat[a][b] + 1;q.push({x, y});}}}return mat;}
};

这篇关于每日OJ题_多源BFS①_力扣542. 01 矩阵(多源BFS解决最短路原理)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/916753

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基