题目
解析
这道题肯定第一时间想到的是dfs。但是这边如果遍历数组的每个位置进行dfs的话,复杂度太高了,这样做理论上时间复杂度会是O((MN)(M*N))。所以可以采用一种逆向的思路。从靠近大洋的四条边开始反向搜索,反向搜索的过程中把能够到的位置进行标记。如果某个位置两个大洋同时都能到,那么这个位置满足条件。这样的复杂度就是O((M+N)*MN).
二刷解法,更简洁
class Solution:
def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
can_reach_pacific = self.can_reach(heights,'pacific')
can_reach_atlan = self.can_reach(heights,'atlan')
ans = []
for i in range(len(heights)):
for j in range(len(heights[0])):
if can_reach_pacific[i][j] and can_reach_atlan[i][j]:
ans.append([i,j])
return ans
def can_reach(self,heights,ocean):
m,n = len(heights),len(heights[0])
can_reach = [[False]*n for _ in range(m)]
visited = [[False]*n for _ in range(m)]
q = collections.deque()
if ocean == 'pacific':
for i in range(m):
can_reach[i][0] = True
q.append((i,0))
visited[i][0] = True
for i in range(n):
can_reach[0][i] = True
q.append((0,i))
visited