题目
你现在手里有一份大小为 N x N 的「地图」(网格) grid,上面的每个「区域」(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,请你找出一个海洋区域,这个海洋区域到离它最近的陆地区域的距离是最大的。
我们这里说的距离是「曼哈顿距离」( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个区域之间的距离是 |x0 - x1| + |y0 - y1| 。
如果我们的地图上只有陆地或者海洋,请返回 -1。
链接:https://leetcode.com/problems/as-far-from-land-as-possible/
Given an N x N grid containing only values 0 and 1, where 0 represents water and 1 represents land, find a water cell such that its distance to the nearest land cell is maximized and return the distance.
The distance used in this problem is the Manhattan distance: the distance between two cells (x0, y0) and (x1, y1) is |x0 - x1| + |y0 - y1|.
If no land or water exists in the grid, return -1.
Example:
Input: [[1,0,1],[0,0,0],[1,0,1]]
Output: 2
Explanation:
The cell (1, 1) is as far as possible from all the land with distance 2.
思路及代码
BFS
class Solution:
def maxDistance(self, grid: List[List[int]]) -> int:
# 从1开始出发bfs,记录距离
m = len(grid)
n = len(grid[0])
start = []
# 存入所有起点1的位置
for i in range(m):
for j in range(n):
if grid[i][j]:
start.append([i,j,0])
# 特例
if not start or len(start) == m*n:
return -1
# 四个方向
x = [1,0,-1,0]
y = [0,1,0,-1]
while start:
i, j, dis = start.pop(0)
for k in range(4):
row = i + x[k]
col = j + y[k]
if row < 0 or col < 0 or row == m or col == n or grid[row][col]:
continue
start.append([row,col,dis+1])
grid[row][col] = 1 #访问过的位置记录为1
return dis #最后一个dis
复杂度
T =
O
(
m
n
)
O(mn)
O(mn)
S =
O
(
m
n
)
O(mn)
O(mn)