题目来源

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 地图分析相关推荐

  1. LeetCode:1162. 地图分析+模板链接

    题目 LeetCode:1162. 地图分析 你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地 ...

  2. LeetCode 1162. 地图分析(BFS)

    1. 题目 你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域 ...

  3. LeetCode 1162 地图分析

    题目: 你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是 ...

  4. leetcode:1162. 地图分析

    题目来源 leetcode:1162. 地图分析 题目描述 题目解析 题目分析 本题要求:求所有海洋点到离它最近的陆地点的距离的最大值. 问题:什么是距离?这里是曼哈顿距离,就是只能沿着横.竖到达另外 ...

  5. Leetcode 1162:地图分析(超详细的解法!!!)

    你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗 ...

  6. 1162. 地图分析 BFS Dijkstra算法

    你现在手里有一份大小为 N x N 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的 ...

  7. 1162. 地图分析

    和01矩阵一样 先找所有的1是起点,再从每个1开始向内广度优先,直至遍历完全部节点 #include <stdc++.h> using namespace std; int line; i ...

  8. 百度地图 华为手机 addEventListener click 不兼容解决

    问题: 项目中的使用了百度地图,前端在监听点击事件的时候是使用 map.addEventListener('click',function(){...}),苹果手机和小米手机均能出发该事件,但是华为手 ...

  9. 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) 是否可行,如 ...

最新文章

  1. 01-迭代开发的基本需求和Scrum标准
  2. Linux_正则表达式
  3. Leetcode 38.外观数列 (每日一题 20210702)
  4. TabHost选项卡的实现(一):使用TabActivity实现
  5. matlab icol,Matlab 图像处理相关函数命令大全
  6. GDB Watchpoints
  7. 【报告分享】2021日化行业社媒营销报告.pdf(附下载链接)
  8. 可蠕虫 DarkRadiation 勒索软件瞄准 Linux 和 Docker 实例
  9. VMware 修复 NSA 报告的 0day
  10. VMware运维工程师常用工具介绍
  11. 数理统计学:世纪末的回顾与展望(陈希孺)
  12. python依赖包冲突
  13. 各品牌路由器默认账号密码
  14. lisp 焊缝标注_钢结构深化设计实施方案.doc
  15. 为什么“蜥蜴书”是机器学习入门必读书?
  16. php 输入经纬度查询位置,根据经纬度查询附近地点信息
  17. Chrome网页视频加速器介绍
  18. Python爬虫120例之案例58,手机APP爬虫,“武器库”的准备and皮皮虾APP的测试
  19. 4.1图像分割之区域生长法
  20. 实用的Linux命令行技巧

热门文章

  1. FastJson序列化后Date日期类型变成时间戳
  2. Making a Difference to Differential Evolution
  3. 2023年女性最佳职场大中华区榜单公布,33家公司入选 | 美通社头条
  4. TOPOGRAPHIC LASER RANGING AND SCANNING Principles and Processing学习笔记
  5. 【天池智慧海洋建设】Topline源码——特征工程学习(大白)
  6. linux unrar 密码,unrar命令
  7. Comsol学习——经典案例:水杯中的自然对流
  8. VisualC++ 2010 Express 学习版官网下载安装及使用
  9. 股市连续大跌,上证指数创新低,还是安心做工业
  10. 求负荷最优分配的matlab编程,电力系统经济调度计算.doc