有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻。
“太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。
这个岛被分割成一个由若干方形单元格组成的网格。
给定一个 m x n 的整数矩阵 heights , heights[r][c] 表示坐标 (r, c) 上单元格 高于海平面的高度 。
岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,
雨水可以直接向北、南、东、西流向相邻单元格。
水可以从海洋附近的任何单元格流入海洋
解题思路:
给定一个矩阵,矩阵可以从大数向相同或小数方向移动。
问是否存在点能流到左侧上侧的同时流到右侧或者下侧。
既然最边上一圈可以分别流入相邻大洋。
那只需要分别 两个大洋 递归查询边界点,并记录 看两个记录矩阵是否重合
重合则说明存在这样一个点能够联通两个大洋
class Solution(object):
def pacificAtlantic(self, heights):
m = len(heights)
n = len(heights[0])
# 记录 visited 矩阵
pac = [[0]*n for _ in range(m)]
atl = [[0]*n for _ in range(m)]
res = []
def dfs(heights, visited, row, col):
if visited[row][col]:
return
visited[row][col] = 1
# 重合则说明存在这样一个点能够联通两个大洋
if (pac[row][col] and atl[row][col]):
res.append([row,col])
# 越界条件 和 流动方向
if row-1>=0 and heights[row-1][col]>=heights[row][col]:
dfs(heights, visited, row-1, col)
if row+1<m and heights[row+1][col]>=heights[row][col]:
dfs(heights,visited, row+1, col)
if col-1>=0 and heights[row][col-1]>=heights[row][col]:
dfs(heights, visited, row, col-1)
if col+1<n and heights[row][col+1]>=heights[row][col]:
dfs(heights, visited, row, col+1)
return
# 分别 两个大洋 递归查询边界点
for i in range(m):
dfs(heights, pac, i, 0)
dfs(heights, atl, i, n-1)
for j in range(n):
dfs(heights, pac, 0, j)
dfs(heights, atl, m-1, j)
return res