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