码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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博客

    算法源码

    1. /**
    2. * @param {number[][]} grid
    3. * @return {number}
    4. */
    5. var maxDistance = function(grid) {
    6. // 将本题的陆地看成污水源,将海洋看成干净水域
    7. // queue用于保存将要扩散的污水源位置
    8. const queue = []
    9. // 遍历grid,找出第一批污水源位置
    10. const n = grid.length
    11. for(let i=0; i
    12. for(let j=0; j
    13. if(grid[i][j] === 1) {
    14. queue.push([i,j])
    15. }
    16. }
    17. }
    18. // seaCount用于保存初始时干净水域的个数
    19. let seaCount = n * n - queue.length
    20. // 如果初始时全部是污水源,或者全部是干净水域,则返回-1
    21. if(queue.length === 0 || seaCount === 0) {
    22. return -1
    23. }
    24. // 上下左右偏移量
    25. const offset = [[-1,0], [1,0], [0,-1], [0,1]]
    26. // dist用于保存最远距离,我这里还使用dist标记污水源,因此dist需要从2开始标记,因为1已经被题目来标记了,因此最终最远距离需要减去1
    27. let dist;
    28. // 当干净水域个数为0时,循环结束
    29. while(seaCount) {
    30. // 取出队头污水源位置
    31. const [x, y] = queue.shift()
    32. dist = grid[x][y] + 1
    33. // 遍历污水源位置的上下左右四个位置,若是干净水域,则将其污染
    34. for(let i=0; i<4; i++) {
    35. const [offsetX, offsetY] = offset[i]
    36. const newX = x + offsetX
    37. const newY = y + offsetY
    38. if(newX < 0 || newX >= n || newY < 0 || newY >= n) continue
    39. if(grid[newX][newY] === 0) {
    40. seaCount--
    41. grid[newX][newY] = dist
    42. // 新增的污染水域,将成为新的污染源
    43. queue.push([newX, newY])
    44. }
    45. }
    46. }
    47. return dist - 1
    48. };

  • 相关阅读:
    C语言实现栈的基本操作
    KONICA MINOLTA China | 柯尼卡美能达-SMB扫描问题
    百题千解计划【CSDN每日一练】“编码”:编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码,把一些有规律的单词编成数字...实现方式:Python、C++、Java、JS...
    DAST 黑盒漏洞扫描器 第二篇:规则篇
    Nacos入门及使用spring-cloud-alibaba系列(一)
    three.js(二):webpack + three.js + ts
    Kotlin第八弹:Kotlin扩展
    你还不进来看看C++类与对象【7】 —— 动态多态底层原理剖析&&(纯)虚析构解决父类指针不能释放子类属性问题嘛
    【网络编程】基于UDP的服务器端/客户端
    2021春招Java面试题大全(精华)
  • 原文地址:https://blog.csdn.net/qfc_128220/article/details/127880023
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号