题目如下:
Given an N x N
grid
containing only values0
and1
, where0
represents water and1
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 1:
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.
Example 2:
Input: [[1,0,0],[0,0,0],[0,0,0]] Output: 4 Explanation: The cell (2, 2) is as far as possible from all the land with distance 4.
Note:
1 <= grid.length == grid[0].length <= 100
grid[i][j]
is0
or1
解题思路:题目不难,注意用BFS,如果用DFS会超时。
代码如下:
class Solution(object): def maxDistance(self, grid): """ :type grid: List[List[int]] :rtype: int """ val = [[float('inf')] * len(grid[0]) for _ in grid] queue = [] for i in range(len(grid)): for j in range(len(grid[i])): if grid[i][j] == 1: queue.append((i, j, 0)) direction = [(0, 1), (0, -1), (1, 0), (-1, 0)] while len(queue) > 0: x, y, dis = queue.pop(0) for (x1, y1) in direction: if x + x1 >= 0 and x + x1 < len(grid) and y + y1 >= 0 \ and y + y1 < len(grid[0]) and grid[x + x1][y + y1] == 0 \ and val[x + x1][y + y1] > dis + 1: val[x + x1][y + y1] = dis + 1 queue.append((x + x1, y + y1, dis + 1)) res = -1 for i in range(len(val)): for j in range(len(val[i])): if val[i][j] != float('inf') and res < val[i][j]: res = val[i][j] return res