LeetCode - 1162 地图分析
题目来源
1162. 地图分析 - 力扣(LeetCode)
题目描述
你现在手里有一份大小为 n x n 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地。
请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最大的,并返回该距离。如果网格上只有陆地或者海洋,请返回 -1。
我们这里说的距离是「曼哈顿距离」( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1| 。
示例
输入 | grid = [[1,0,1],[0,0,0],[1,0,1]] |
输出 | 2 |
说明 |
海洋单元格 (1, 1) 和所有陆地单元格之间的距离都达到最大,最大距离为 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
题目解析
这题的意思是,找到一个海域,保证该海域离所有的陆地最远。
如果我们假设陆地到本身的距离为0,而与陆地相邻的区域距离为1,依次递进,可以得到如下图所示
如果我们将陆地看成一个污水源,那么本题找距离陆地最远的海域问题,其实就是污水源的扩散问题,即合适可以将所有还需污染完。
从上面图示,可以看出:海洋单元格 (1, 1) 和所有陆地单元格之间的距离都达到最大,最大距离为 2。
本题可以使用图的多源BFS来求解。
关于图的多源BFS可以参考华为机试 - 计算疫情扩散时间_伏城之外的博客-CSDN博客
算法源码
/*** @param {number[][]} grid* @return {number}*/
var maxDistance = function(grid) {// 将本题的陆地看成污水源,将海洋看成干净水域// queue用于保存将要扩散的污水源位置const queue = []// 遍历grid,找出第一批污水源位置const n = grid.lengthfor(let i=0; i<n; i++) {for(let j=0; j<n; j++) {if(grid[i][j] === 1) {queue.push([i,j])}}}// seaCount用于保存初始时干净水域的个数let seaCount = n * n - queue.length// 如果初始时全部是污水源,或者全部是干净水域,则返回-1if(queue.length === 0 || seaCount === 0) {return -1}// 上下左右偏移量const offset = [[-1,0], [1,0], [0,-1], [0,1]]// dist用于保存最远距离,我这里还使用dist标记污水源,因此dist需要从2开始标记,因为1已经被题目来标记了,因此最终最远距离需要减去1let dist;// 当干净水域个数为0时,循环结束while(seaCount) {// 取出队头污水源位置const [x, y] = queue.shift()dist = grid[x][y] + 1// 遍历污水源位置的上下左右四个位置,若是干净水域,则将其污染for(let i=0; i<4; i++) {const [offsetX, offsetY] = offset[i]const newX = x + offsetXconst newY = y + offsetYif(newX < 0 || newX >= n || newY < 0 || newY >= n) continueif(grid[newX][newY] === 0) {seaCount--grid[newX][newY] = dist// 新增的污染水域,将成为新的污染源queue.push([newX, newY])}}}return dist - 1
};
LeetCode - 1162 地图分析相关推荐
- LeetCode:1162. 地图分析+模板链接
题目 LeetCode:1162. 地图分析 你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地 ...
- LeetCode 1162. 地图分析(BFS)
1. 题目 你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域 ...
- LeetCode 1162 地图分析
题目: 你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是 ...
- leetcode:1162. 地图分析
题目来源 leetcode:1162. 地图分析 题目描述 题目解析 题目分析 本题要求:求所有海洋点到离它最近的陆地点的距离的最大值. 问题:什么是距离?这里是曼哈顿距离,就是只能沿着横.竖到达另外 ...
- Leetcode 1162:地图分析(超详细的解法!!!)
你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗 ...
- 1162. 地图分析 BFS Dijkstra算法
你现在手里有一份大小为 N x N 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的 ...
- 1162. 地图分析
和01矩阵一样 先找所有的1是起点,再从每个1开始向内广度优先,直至遍历完全部节点 #include <stdc++.h> using namespace std; int line; i ...
- 百度地图 华为手机 addEventListener click 不兼容解决
问题: 项目中的使用了百度地图,前端在监听点击事件的时候是使用 map.addEventListener('click',function(){...}),苹果手机和小米手机均能出发该事件,但是华为手 ...
- leetcode刷题:不同路径II
分析: 我们用 f(i, j)f(i,j) 来表示从坐标 (0, 0)(0,0) 到坐标 (i, j)(i,j) 的路径总数,u(i, j)u(i,j) 表示坐标 (i, j)(i,j) 是否可行,如 ...
最新文章
- 01-迭代开发的基本需求和Scrum标准
- Linux_正则表达式
- Leetcode 38.外观数列 (每日一题 20210702)
- TabHost选项卡的实现(一):使用TabActivity实现
- matlab icol,Matlab 图像处理相关函数命令大全
- GDB Watchpoints
- 【报告分享】2021日化行业社媒营销报告.pdf(附下载链接)
- 可蠕虫 DarkRadiation 勒索软件瞄准 Linux 和 Docker 实例
- VMware 修复 NSA 报告的 0day
- VMware运维工程师常用工具介绍
- 数理统计学:世纪末的回顾与展望(陈希孺)
- python依赖包冲突
- 各品牌路由器默认账号密码
- lisp 焊缝标注_钢结构深化设计实施方案.doc
- 为什么“蜥蜴书”是机器学习入门必读书?
- php 输入经纬度查询位置,根据经纬度查询附近地点信息
- Chrome网页视频加速器介绍
- Python爬虫120例之案例58,手机APP爬虫,“武器库”的准备and皮皮虾APP的测试
- 4.1图像分割之区域生长法
- 实用的Linux命令行技巧
热门文章
- FastJson序列化后Date日期类型变成时间戳
- Making a Difference to Differential Evolution
- 2023年女性最佳职场大中华区榜单公布,33家公司入选 | 美通社头条
- TOPOGRAPHIC LASER RANGING AND SCANNING Principles and Processing学习笔记
- 【天池智慧海洋建设】Topline源码——特征工程学习(大白)
- linux unrar 密码,unrar命令
- Comsol学习——经典案例:水杯中的自然对流
- VisualC++ 2010 Express 学习版官网下载安装及使用
- 股市连续大跌,上证指数创新低,还是安心做工业
- 求负荷最优分配的matlab编程,电力系统经济调度计算.doc