leetcode 题目1162 地图分析

2020/3/29  打卡

题目

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

我们这里说的距离是『曼哈顿距离』( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个区域之间的距离是 |x0 - x1| + |y0 - y1| 。
如果我们的地图上只有陆地或者海洋,请返回 -1。


示例 1:

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

示例 2:

    输入:[[1,0,0],
          [0,0,0],
          [0,0,0]]
    输出:4
    解释: 海洋区域 (2, 2) 和所有陆地区域之间的距离都达到最大,最大距离为 4。
题意:  1.找到一个海洋区域,这个海洋区域到与它最近的陆地区域的距离是最大的。
       2.找一个海洋区域距离左右陆地的距离都最远,求这个最远的曼哈顿距离
      返回该海洋区域到离它最近的陆地区域的距离。

思路

动态规划  (先从左上走,察觉情况,再从 右下走,作为另一种情况的察觉,从而整理完成四周陆地距离情形的察觉,并以最小距离值作为状态值衡量。)
1.从左上角遍历一遍,
  (1).当(i, j)为陆地时  dis[i][j] = 0;
  (2).当(i, j)为海洋时,dis[i][j]为上边点与左边点的dis最小值 加1。
2.从右下角遍历一遍,
  (1).当(i, j)为陆地时,dis[i][j] = 0;
  (2).当(i, j)为海洋时,dis[i][j]为(下边点dis加1)、(右边点的dis加1)、(dis[i][j]本身)三者的最小值。

代码

class Solution:
    def maxDistance(self, grid):
        n, m = len(grid), len(grid[0])
        # 创建初始的状态,这里的状态值表示   距离周围陆地的最近距离min。
        dis = [[float("inf") for j in range(m+2)] for i in range(n+2)]

        # 从左上角遍历一遍
        for i in range(1, n+1):
            for j in range(1, m+1):
                #当(i, j)为陆地时  dis[i][j] = 0
                if grid[i-1][j-1]:
                    dis[i][j] = 0
                #当(i, j)为海洋时,dis[i][j]为上边点与左边点的dis最小值加
                else:
                    dis[i][j] = min(dis[i-1][j], dis[i][j-1]) + 1
        res = -1
        # 从右下角遍历一遍
        for i in range(n, 0, -1):
            for j in range(m, 0, -1):
                #当(i, j)为陆地时,dis[i][j] = 0
                if grid[i-1][j-1]:
                    dis[i][j] = 0
                #当(i, j)为海洋时,dis[i][j]为(下边点dis加1)、(右边点的dis加1)、(dis[i][j]本身)三者的最小值
                else:
                    dis[i][j] = min(dis[i+1][j]+1, dis[i][j+1]+1, dis[i][j])

                    # 我们最终求取的目标是  距离周围陆地的最近距离 中最大的一个,表示这个地点符合题意, 最近的最远。  距离最近的陆地距离中最大的距离衡量中最大的那个。
                    res = max(dis[i][j], res)

        # 返回res即为目标。
        return res if res != -1 and res != float("inf") else -1

 

你可能感兴趣的:(马飞飞的刷题日记)