题目:
给定一个 m*n 矩阵,矩阵的每个点表示海拔
“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。
规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。
请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。
题解:
对于太平洋和大西洋,各运行一次广度优先搜索,得到“流域”
两洋“流域”交集的点,就是结果
import collections
class Solution:
def pacificAtlantic(self, heights):
m = len(heights)
n = len(heights[0])
# 两洋“流域”,先存储初始值
pacific = set([(0, y) for y in range(n)] + [(x, 0) for x in range(m)])
atlantic = set([(m-1, y) for y in range(n)] + [(x, n-1) for x in range(0, m)])
# 运行 BFS
pq = collections.deque(list(pacific))
aq = collections.deque(list(atlantic))
delta = [(-1,0), (0,1), (1,0), (0,-1)]
while(pq):
(x,y) = pq.popleft()
for (dx,dy) in delta:
(x1, y1) = (x+dx, y+dy)
if (x1 < 0 or x1 >= m): continue # 坐标超出范围
if (y1 < 0 or y1 >= n): continue
if (x1, y1) in pacific: continue # 已经存在,则退出
if (heights[x1][y1] >= heights[x][y]):
pacific.add((x1, y1))
pq.append((x1, y1))
while(aq):
(x,y) = aq.popleft()
for (dx,dy) in delta:
(x1, y1) = (x+dx, y+dy)
if (x1 < 0 or x1 >= m): continue # 坐标超出范围
if (y1 < 0 or y1 >= n): continue
if (x1, y1) in atlantic: continue # 已经存在,则退出
if (heights[x1][y1] >= heights[x][y]):
atlantic.add((x1, y1))
aq.append((x1, y1))
# 两洋流域相交的坐标
return [list(coord) for coord in (pacific & atlantic)]
执行用时:88 ms, 在所有 Python3 提交中击败了95.59%的用户
内存消耗:16 MB, 在所有 Python3 提交中击败了63.77%的用户