当前位置: 首页 > news >正文

LeetCode 1162. As Far from Land as Possible【多源BFS】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

你现在手里有一份大小为 n x n 的 网格 grid,上面的每个 单元格 都用 01 标记好了。其中 0 代表海洋,1 代表陆地。

请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最大的,并返回该距离。如果网格上只有陆地或者海洋,请返回 -1

我们这里说的距离是「曼哈顿距离」( Manhattan Distance):(x0, y0)(x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1|

示例 1:

输入:grid = [[1,0,1],[0,0,0],[1,0,1]]
输出:2
解释: 
海洋单元格 (1, 1) 和所有陆地单元格之间的距离都达到最大,最大距离为 2

示例 2:

输入:grid = [[1,0,0],[0,0,0],[0,0,0]]
输出:4
解释:
海洋单元格 (2, 2) 和所有陆地单元格之间的距离都达到最大,最大距离为 4

提示:

  • n == grid.length
  • n == grid[i].length
  • 1 <= n <= 100
  • grid[i][j] 不是 0 就是 1

本题与542. 01 Matrix相同。

解法 多源BFS

这里不是求某一个海洋区域到陆地区域的最短路,而是求所有的海洋区域到陆地区域这个「点集」的最短路。显然这不是一个「单源」最短路问题(SSSP)。在我们学习过的最短路算法中,求解 SSSP 问题的方法有 Dijkstra 算法和 SPFA算法,而求解任意两点之间的最短路一般使用 Floyd 算法。那我们在这里就应该使用 Floyd 算法吗?

要考虑这个问题,我们需要分析一下这里使用 Floyd 算法的时间复杂度。我们知道在网格图中求最短路,每个区域(格子)相当于图中的顶点,而每个格子和上下左右四个格子的相邻关系相当于边,我们记顶点的个数为 V V V ,Floyd 算法的时间复杂度为 O ( V 3 ) O(V^3) O(V3) ,而这里 V = n 2 V = n^2 V=n2 ,所以 O ( V 3 ) = O ( n 6 ) O(V^3) = O(n^6) O(V3)=O(n6) ,显然是不现实的。

考虑 SSSP 是求一个源点到一个点集中所有点的最短路,而这个问题的本质是求某个点集到另一个点集中所有点的最短路,即「多源最短路」,我们只需要对 Dijkstra 算法或者 SPFA 算法稍作修改。这里以 Dijkstra 算法为例,我们知道堆优化的 Dijkstra 算法实际上是 BFS 的一个变形把 BFS 中的队列变成了优先队列,在拓展新状态的时候加入了松弛操作。Dijkstra 的堆优化版本第一步是源点入队,我们只需要把它改成源点集合中的所有的点入队,就可以实现求「多源最短路」。

思考:为什么?
因为我们这样做相当于建立了一个超级源点 S S S这个点与源点集中的 s 0 , s 1 , s 2 ⋯ s ∣ V ∣ s_0, s_1, s_2 \cdots s_{|V|} s0,s1,s2sV 都有边,并且权都为 0 0 0 。这样求源点集到目标点集的最短路,就变成了求超级源点 S S S 到它们的最短路,于是又转化成了 SSSP 问题。

继续思考:海洋区域和陆地区域,应该哪一个作为源点集?
也许你分析出「我们需要找一个海洋区域,满足它到陆地的最小距离是最大」会把海洋区域作为源点集。考虑后续的实现,我们知道 Dijkstra 中一个 d d d 数组用来维护当前源点集到其他点的最短路,而对于源点集中的任意一个点 s s s d [ s x ] [ s y ] = 0 d[s_x][s_y] = 0 d[sx][sy]=0 ,这很好理解,源点到源点的最短路就是 0 0 0 。如果我们把海洋区域作为源点集、陆地区域作为目标点集,假设 t t t 是目标点集中的一个点,算法执行结束后 d [ t x ] [ t y ] d[t_x][t_y] d[tx][ty] 就是海洋区域中的点到 t t t 的最短距离,但是我们却不知道哪些 t t t 是海洋区域点的「最近陆地区域」,我们也不知道每个 s s s 距离它的「最近陆地区域」的曼哈顿距离。

考虑我们把陆地区域作为源点集、海洋区域作为目标点集,目标点集中的点 t t t 对应的 d [ t x ] [ t y ] d[t_x][t_y] d[tx][ty] 就是海洋区域 t t t 对应的距离它的「最近陆地区域」的曼哈顿距离,正是我们需要的,所以应该把陆地区域作为源点集。最终只需要比出 d [ t x ] [ t y ] d[t_x][t_y] d[tx][ty] 的最大值即可。如果使用 Dijkstra 算法,那么在初始化 d 数组时,把每个元素预置为 INF,所以如果发现最终比出的最大值为 INF,那么就返回 − 1 -1 1

由于这里的边权为 1 1 1 ,不如直接使用多源 BFS,在这里每个点都只会被松弛一次

class Solution {
public:int maxDistance(vector<vector<int>>& grid) {int n = grid.size();queue<pair<int, int>> q;int MAX_VALUE = n + n;for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {if (grid[i][j] == 1) {grid[i][j] = 0;q.push({i, j});} else grid[i][j] = MAX_VALUE;}}int d[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};int ans = -1;while (!q.empty()) {auto [x, y] = q.front(); q.pop();for (int i = 0; i < 4; ++i) {int u = x + d[i][0], v = y + d[i][1];if (u >= 0 && u < n && v >= 0 && v < n && grid[x][y] + 1 < grid[u][v]) {// 只有海洋单元格的值会被更新,且一次性更新为到最近陆地单元格的距离grid[u][v] = grid[x][y] + 1;ans = max(ans, grid[u][v]);q.push({u, v});}}}return ans;}
};

复杂度分析:

  • 时间复杂度: O ( m n ) O(mn) O(mn)
  • 空间复杂度: O ( m n ) O(mn) O(mn) ,虽然我们是原地修改,但是使用队列时,如果都是 1 1 1 都是陆地,就全部要入队。

相关文章:

LeetCode 1162. As Far from Land as Possible【多源BFS】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

【算法】二分查找(整数二分和浮点数二分)

二分查找也称折半查找&#xff08;Binary Search&#xff09;&#xff0c;是一种效率较高的查找方法&#xff0c;时间复杂度为O(logN)。 二分查找采用了“分治”策略。使用二分查找时&#xff0c;数组中的元素之间得有单调性&#xff08;升序或者降序&#xff09;。 二分的模…...

git压缩/合并多次commit提交为1次commit提交

git压缩/合并N次commit提交为1次commit提交 假设有最近3次提交&#xff1a; commit_id1 commit_id2 commit_id3目标是把以上3次commit合并成1个commit&#xff0c;注意&#xff0c;最新的commit提交在最上面。 在git bash里面的操作步骤&#xff1a; &#xff08;1&#xff0…...

【3519DV500】AI算法承载硬件平台_2.5T算力+AI ISP图像处理_超感光视频硬件方案开发

Hi3519DV500 内置双核 A55 &#xff0c;提供高效、丰富和灵活的CPU 资源&#xff0c;以满足客户计算和控制需求。 Hi3519DV500集成了高效的神经网络推理引擎&#xff0c;最高2.5Tops NN算力&#xff0c;支持业界主流的神经 网络框架。神经网络支持完整的 API 和工具链&#xf…...

Linux系统基础服务启动的方法

服务&#xff0c;其实就是运行在操作系统后台的一个或者多个应用程序&#xff0c;为计算机系统或用户提供某项特定的服务。Linux系统运行的绝大多数服务都是需要安装才有的&#xff0c;例如FTP服务、httpd服务、MySQL、redis、Zookeeper、rabbitmq、vsftpd等等&#xff0c;那么…...

STM32 FLASH 读写数据

1. 《STM32 中文参考手册》&#xff0c;需要查看芯片数据手册&#xff0c;代码起始地址一般都是0x8000 0000&#xff0c;这是存放整个项目代码的起始地址 2. 编译信息查看代码大小&#xff0c;修改代码后第一次编译后会有这个提示信息 2.1 修改代码后编译&#xff0c;会有提示…...

excel功能区(ribbonx)编程笔记--1 初识功能区

再office2003版本以前,excel是具有菜单栏和工具栏的,再office2007及以后的版本中,界面中没有菜单栏和工具栏,使用功能区替换了菜单和工具栏。 您可能意识到自定义用户界面也变得更加困难,其实设置功能区并不会像您想像的那样困难,因为Microsoft也意识到必须有一种方式供开…...

电脑远程接入软件可以进行文件传输吗?快解析内网穿透

电脑远程接入软件的出现&#xff0c;让我们可以在两台电脑之间进行交互和操作。但是&#xff0c;很多人对于这些软件能否进行文件传输还存在一些疑问。下面的文章将解答这个问题。 1.电脑远程接入软件可以进行文件传输。传统上&#xff0c;我们可能会通过传输线或者移动存储设…...

react-native-webview使用postMessage后H5不能监听问题(iOS和安卓的兼容问题)

/* 监听rn消息 */ const eventListener nativeEvent > {//解析数据actionType、extraconst {actionType, extra} nativeEvent.data && JSON.parse(nativeEvent.data) || {} } //安卓用document&#xff0c;ios用window window.addEventListener(message, eventLis…...

通过LD_PRELOAD绕过disable_functions

LD_PRELOAD LD_PRELOAD是Linux/Unix系统的一个环境变量&#xff0c;它可以影响程序的运行时的链接&#xff0c;它允许在程序运行前定义优先加载的动态链接库。通过这个环境变量&#xff0c;可以在主程序和其动态链接库的中间加载别的动态链接库&#xff0c;甚至覆盖系统的函数…...

Python批量爬虫下载文件——把Excel中的超链接快速变成网址

本文的背景是&#xff1a;大学关系很好的老师问我能不能把Excel中1000个超链接网址对应的pdf文档下载下来。虽然可以手动一个一个点击下载&#xff0c;但是这样太费人力和时间了。我想起了之前的爬虫经验&#xff0c;给老师分析了一下可行性&#xff0c;就动手实践了。    没…...

Crimson:高性能,高扩展的新一代 Ceph OSD

背景 随着物理硬件的不断发展&#xff0c;存储软件所使用的硬件的情况也一直在不断变化。 一方面&#xff0c;内存和 IO 技术一直在快速发展&#xff0c;硬件的性能在极速增加。在最初设计 Ceph 的时候&#xff0c;通常情况下&#xff0c;Ceph 都是被部署到机械硬盘上&#x…...

【websocket】websocket-client 与 websockets

websocket-client websocket-client 是 websocket 客户端&#xff0c;提供了对ws低级API的访问。通过导入 websocket 库使用&#xff0c;websocket 库是基于事件驱动的设计模式&#xff0c;通过定义回调函数来处理接收到的消息、错误和连接关闭等事件。 优势&#xff1a; 兼容…...

Qt快速学习(一)--对象,信号和槽

目录 1.Qt概述 1.1 什么是Qt 2.2 手动创建 2.3 pro文件 2.4 一个最简单的Qt应用程序 3 第一个Qt小程序 3.1 按钮的创建 3.2 对象模型&#xff08;对象树&#xff09; 3.3 Qt窗口坐标体系 4 信号和槽机制 4.1 系统自带的信号和槽 4.2 自定义信号和槽 4.3信号槽的拓展 4…...

Qt6之如何为QDialog添加最大化和最小化按钮

在QDialog构造函数中添加以下几行代码&#xff1a; // 设置窗体最大化和最小化Qt::WindowFlags windowFlag Qt::Dialog;windowFlag | Qt::WindowMinimizeButtonHint;windowFlag | Qt::WindowMaximizeButtonHint;windowFlag …...

攻防世界-warmup

原题解题思路 只有一张图片&#xff0c;就查看源代码&#xff0c;有一个source.php。 查看source.php&#xff0c;白名单中还有一个hint.php。 hint.php告诉我们flag的位置ffffllllaaaagggg 但是直接跳转是没用的&#xff0c;构造payload。 http://61.147.171.105:55725/sourc…...

02__models

LangChain提供两种封装的模型接口 1.大规模语言模型&#xff08;LLM&#xff09;&#xff1a;输入文本字符串&#xff0c;返回文本字符串 2.聊天模型&#xff1a;基于一个语言模型&#xff0c;输入聊天消息列表&#xff0c;返回聊天消息 Langchain的支持OpenAI、ChatGLM、Hu…...

MyBatis入门配置及CURD实现

目录 一、MyBatis简介 1. 什么是 MyBatis ? 2. MyBatis的特性 3. 什么是持久层框架&#xff1f; 二、MyBatis环境配置 2.1 创建maven工程 2.2 导入相关pom依赖 2.3 导入jdbc配置文件 2.4 Mybatis相关插件安装 3.5 Mybatis-cfg.xml 核心配置 2.6 引入Log4j2日志文件…...

《游戏编程模式》学习笔记(五)原型模式 Prototype Pattern

原型的定义 用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。 举个例子 假设我现在要做一款游戏&#xff0c;这个游戏里有许多不同种类的怪物&#xff0c;鬼魂&#xff0c;恶魔和巫师。这些怪物通过“生产者”进入这片区域&#xff0c;每种敌人…...

ansible案列之LNMP分布式剧本

LNMP分布式剧本 一&#xff1a;环境设置二&#xff1a;编写Nginx剧本准备nginx下载源准备配置文件并开放PHP的访问路径准备php测试页面编写nginx剧本 三&#xff1a;编写Mysql剧本编写密码获取脚本准备Mysql的yum源编写mysql剧本 四&#xff1a;准备PHP剧本准备两个配置文件编写…...

React2023电商项目实战 - 1.项目搭建

古人学问无遗力&#xff0c;少壮工夫老始成。 纸上得来终觉浅&#xff0c;绝知此事要躬行。 —— 陆游《《冬夜读书示子聿》》 系列文章目录 项目搭建App登录及网关App文章自媒体平台&#xff08;博主后台&#xff09;内容审核(自动) 文章目录 系列文章目录一、项目介绍1.页面…...

数据库连接池(c3p0和德鲁伊)

目录 连接池介绍 c3p0连接池 传统方法引入jar包 配置文件 德鲁伊连接池 德鲁伊工具类 传统jdbc数据库使用DriverManger来获取&#xff0c;每次向数据库建立连接需要将Connection加载到内存中&#xff0c;频繁的操作会造成占用很多系统资源&#xff0c;造成服务器崩溃&…...

ARM--day6(实现字符、字符串收发的代码和现象,分析RCC、GPIO、UART章节)

uart4.h #ifndef __UART4_H__ #define __UART4_H__#include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h"//RCC/GPIO/UART4章节初始化 void hal_uart4_init();//发送一个字符函数 void hal_put_char(const c…...

2023牛客暑期多校训练营9 B.Semi-Puzzle: Brain Storm

文章目录 题目大意题解求解回溯 参考代码 题目大意 给定两个数 a , m a,m a,m &#xff0c;求满足 a u ≡ u ( m o d m ) a^u \equiv u (mod\ \ m) au≡u(mod m) 的一个解。 ( 1 ≤ a , m ≤ 1 0 9 , 0 ≤ u ≤ 1 0 18 ) (1\leq a,m \leq10^9 ,0\leq u\leq 10^{18}) (1≤a…...

mysql中的窗口函数

MySQL中的窗口函数&#xff08;Window Functions&#xff09;是一种用于在查询结果集内执行计算的功能。窗口函数可以在查询中进行分析和聚合操作&#xff0c;而无需将查询结果分组。它们可以用于计算排名、行号、累积值等各种分析操作。窗口函数通常与OVER子句一起使用&#x…...

【双指针】经典数组双指针题LeetCode

文章目录 27. 移除元素 简单283. 移动零 简单&#x1f525;167. 两数之和 II - 输入有序数组 中等11. 盛最多水的容器 中等&#x1f525;15. 三数之和 中等&#xff08;N数之和&#xff09;中等&#x1f525;42. 接雨水 困难 &#x1f525;26. 删除有序数组中的重复项 简单5. 最…...

极智嘉x吉利汽车 x京东物流,引领汽车行业智慧物流新变革!

近日&#xff0c;中国领先的汽车制造商吉利汽车携手中国领先的技术驱动的供应链解决方案及物流服务商京东物流、全球仓储机器人引领者极智嘉(Geek)&#xff0c;在西安吉利汽车制造基地RDC仓库率先落地SkyPick上存下拣解决方案&#xff0c;实现了全物流链精益化、智能化、一体化…...

RK3588平台开发系列讲解(AI 篇)RKNN C API 详细说明

文章目录 一、API 硬件平台支持说明二、API 函数介绍2.1、rknn_init2.2、rknn_destroy2.3、rknn_query2.4、rknn_inputs_set2.5、rknn_run2.6、rknn_outputs_get2.7、rknn_outputs_release沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解 RKNN C API 详细…...

【基础】Android Handler

一、博客参考 Handler机制详解【重点】&#xff1a;https://www.jianshu.com/p/b4d745c7ff7a Handler Thread工作线程操作UI范例【重点】&#xff1a;https://www.cnblogs.com/net168/p/4075126.html 二、内存泄漏的解决&#xff1a;静态内部类弱引用 关于 Handler&#xf…...

c语言实现MD5算法

MD5加密 文章目录 MD5加密MD5介绍应用场景代码分析 &#xff08;基于qt5.14.2&#xff09;测试记录 MD5介绍 1。 一种单向加密算法&#xff0c;即对明文加密&#xff0c;而不能通过密文得到明文。对原数据的任何改动&#xff0c;哪怕是1字节&#xff0c;得到的MD5值都有很大的区…...

办公室装修计入什么会计科目/山西seo排名厂家

try:#code except SomeError1 as e:#codeprint(e) except SomeError2 as e:#codeprint(e) else:#code 没出错的时候执行 finally:#code 不管有没有错都会执行 也可以这样写&#xff1a;try:#code except (SomeError1,SomeError2) as e:#code 所以异常类都继承自Exception,一般放…...

自己怎么做优惠卷网站/百度关键词优化企业

竞和之路【图片 价格 品牌 报价】-京东竞和之路...

黄石市城市建设档案馆网站/网络营销的工作内容包括哪些

增 push   在数组的末尾添加一个或多个元素&#xff0c;并返回新的长度。 array.push(1,2,3.........) unshift  在数组的开头添加一个或多个元素&#xff0c;并返回新的长度。 array.unshift(1,2,3......) splice   在制定位置添加一个活多个元素&#xff0c;splice(s…...

开发一个官方网站要多少钱/百度关键词推广方案

复试啦该动手OJ了&#xff0c;就从网上找了一个顺序&#xff0c;赶紧的 一菜鸟 1089-1096、1001、2000—2011、2039、1720、1062、2104、1064、2734、1170、1197、2629、2012—2030、2032、2040、2042、2054、2055 二菜鸟驿 2072、2081、2093、2091、1004、2057、2031、2033、…...

wordpress后台密码默认/怎样建立一个网络销售平台

图像阈值分割-全局阈值分割 1. 全局阈值分割 在Halcon中&#xff0c;算子threshold、fast_threshold实现全局阈值分割&#xff0c;其原型如下&#xff1a; threshold(Image : Region : MinGray, MaxGray : ) 参数Image:输入图像Region&#xff1a;输出分割区域MinGray&…...

网站宝建站/windows优化大师官方网站

您可以创建另一个组,并将www-data(如果您的Web服务器在www-data用户下运行)添加到该组,然后将该组分配给所有您希望访问的文件.或者,如果您只需要读取权限,而系统上的其他用户对您的文件具有读取权限也不是问题,那么只需更改文件的权限(在其他位置)以拥有对其他文件的读取权限.…...