给定一个 m x n
的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。
规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。
请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。
提示:
- 输出坐标的顺序不重要
- m 和 n 都小于150
示例:
给定下面的 5x5 矩阵: 太平洋 ~ ~ ~ ~ ~ ~ 1 2 2 3 (5) * ~ 3 2 3 (4) (4) * ~ 2 4 (5) 3 1 * ~ (6) (7) 1 4 5 * ~ (5) 1 1 2 4 * * * * * * 大西洋 返回: [[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (上图中带括号的单元).
思路:
从海洋倒着往大陆流,四方向DFS,只能从低往高流,
看看哪些点既能被太平洋的水流到又能被大西洋的水流到
class Solution(object):
def pacificAtlantic(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[List[int]]
"""
if not matrix or not matrix[0]:
return list()
m, n = len(matrix), len(matrix[0])
po = [[0 for i in range(n)] for j in range(m)] #po[i][j] = 1就代表matrix[i][j]可以被太平洋的水流到
ao = [[0 for i in range(n)] for j in range(m)] #同上,换成大西洋
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
def dfs(x0, y0, string):
if visited[x0][y0] == 1:#来过了
return
visited[x0][y0] = 1
if string == "po":
po[x0][y0] = 1
else:
ao[x0][y0] = 1
for k in range(4):
x = x0 + dx[k]
y = y0 + dy[k]
if 0<= x < m and 0 <= y < n and matrix[x][y] >= matrix[x0][y0]: #可以流到下一个点
dfs(x, y, string)
visited = [[0 for i in range(n)] for j in range(m)]
i = 0
for j in range(n):
dfs(i, j, "po") #上面的太平洋
visited = [[0 for i in range(n)] for j in range(m)]
i = m - 1
for j in range(n):
dfs(i, j, "ao") #下面的大西洋
visited = [[0 for i in range(n)] for j in range(m)]
j = 0
for i in range(m):
dfs(i, j, "po") #左边的太平洋
visited = [[0 for i in range(n)] for j in range(m)]
j = n - 1
for i in range(m):
dfs(i, j, "ao") #右边的大西洋
res = []
for i in range(m):
for j in range(n):
if po[i][j] and ao[i][j]: #取交集
res.append([i, j])
return res