太平洋大西洋水流问题
有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。
这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights , heights[r][c] 表示坐标 (r, c) 上单元格 高于海平面的高度 。
岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,雨水可以直接向北、南、东、西流向相邻单元格。水可以从海洋附近的任何单元格流入海洋。
返回 网格坐标 result 的 2D列表 ,其中 result[i] = [ri, ci] 表示雨水可以从单元格 (ri, ci) 流向 太平洋和大西洋 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pacific-atlantic-water-flow
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
AC代码
class Solution:
def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
m = len(heights)
n = len(heights[0])
def getavail(inputs):
avail = set()
def dfs(x, y):
if (x, y) in avail:
return
avail.add((x, y))
for nx, ny in [(x, y + 1), (x, y - 1), (x + 1, y), (x - 1, y)]:
if 0 <= nx < m and 0 <= ny < n and heights[x][y] <= heights[nx][ny]:
dfs(nx, ny)
for x, y in inputs:
dfs(x, y)
return avail
p = [(0, i) for i in range(n)] + [(j, 0) for j in range(1, m)]
a = [(m - 1, i) for i in range(n)] + [(j, n - 1) for j in range(m - 1)]
return list(map(list, getavail(p) & getavail(a)))
官方代码
class Solution:
def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
m, n = len(heights), len(heights[0])
def search(starts: List[Tuple[int, int]]) -> Set[Tuple[int, int]]:
visited = set()
def dfs(x: int, y: int):
if (x, y) in visited:
return
visited.add((x, y))
for nx, ny in ((x, y + 1), (x, y - 1), (x - 1, y), (x + 1, y)):
if 0 <= nx < m and 0 <= ny < n and heights[nx][ny] >= heights[x][y]:
dfs(nx, ny)
for x, y in starts:
dfs(x, y)
return visited
pacific = [(0, i) for i in range(n)] + [(i, 0) for i in range(1, m)]
atlantic = [(m - 1, i) for i in range(n)] + [(i, n - 1) for i in range(m - 1)]
return list(map(list, search(pacific) & search(atlantic)))
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/pacific-atlantic-water-flow/solution/tai-ping-yang-da-xi-yang-shui-liu-wen-ti-sjk3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1、最开始遍历有点想不明白,总觉得会有问题,这种从已成立的点开始遍历是个不会有问题的遍历方法