你如今手裏有一份大小爲 N x N 的『地圖』(網格) grid
,上面的每一個『區域』(單元格)都用 0
和 1
標記好了。其中 0
表明海洋,1
表明陸地,你知道距離陸地區域最遠的海洋區域是是哪個嗎?請返回該海洋區域到離它最近的陸地區域的距離。python
咱們這裏說的距離是『曼哈頓距離』( Manhattan Distance):(x0, y0)
和 (x1, y1)
這兩個區域之間的距離是 |x0 - x1| + |y0 - y1|
。app
若是咱們的地圖上只有陸地或者海洋,請返回 -1
。code
示例 1:blog
輸入:[[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。
提示:io
1 <= grid.length == grid[0].length <= 100
grid[i][j]
不是 0
就是 1
Solution:class
其實這一題跟number of islands很像,都是bfs把0變1的4-way搜索。對於每個0(water),都存在離它最近的陸地距離,須要找到全部的距離中的最大值。解法就是把陸地放到deque隊列中,再逐層搜索,每一次把d=1,d=2,...遞增的全部的0都找到並變爲1,逐層distance增長,最後返回的就是最大距離。import
from collections import deque class Solution(object): def maxDistance(self, grid): """ :type grid: List[List[int]] :rtype: int """ lands = deque([]) # python的隊列是deque n, res = len(grid), -1 for x in range(n): for y in range(n): if grid[x][y]: # land found lands.append((x, y)) if len(lands) == 0 or len(lands) == n*n: return res dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1] while lands: num = len(lands) for _ in range(num): x0, y0 = lands.popleft() # tuple還能這樣用 for i in range(4): # 4-way bfs search x, y = x0 + dx[i], y0 + dy[i] if 0 <= x < n and 0 <= y < n and not grid[x][y]: # water found grid[x][y] = 1 # 很像number of islands lands.append((x, y)) res += 1 return res