• 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. };

  • 相关阅读:
    Java IO流
    TCP协议与UDP协议
    【DBA100人】李建明:一名普通DBA的14年技术之路与成长智慧
    java 工程管理系统源码+项目说明+功能描述+前后端分离 + 二次开发
    【MindInsight】【Summary】报错“Hyper config is not in system envi
    全栈项目【尚医通】预约挂号系统项目介绍
    Read-Easy Excel源码解析(一)
    【数据结构与算法】环形队列的介绍、用数组实现环形数组
    Android系统源码目录详解
    分享两个实用的PPT制作技巧
  • 原文地址:https://blog.csdn.net/qfc_128220/article/details/127880023