class Solution:
def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
ROWS, COLS = len(heights), len(heights[0])
directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
pacific = atlantic = False
def dfs(r, c, prevVal):
nonlocal pacific, atlantic
if r < 0 or c < 0:
pacific = True
return
if r >= ROWS or c >= COLS:
atlantic = True
return
if heights[r][c] > prevVal:
return
tmp = heights[r][c]
heights[r][c] = float('inf')
for dx, dy in directions:
dfs(r + dx, c + dy, tmp)
if pacific and atlantic:
break
heights[r][c] = tmp
res = []
for r in range(ROWS):
for c in range(COLS):
pacific = False
atlantic = False
dfs(r, c, float('inf'))
if pacific and atlantic:
res.append([r, c])
return resWhere is the number of rows and is the number of columns.
class Solution:
def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
ROWS, COLS = len(heights), len(heights[0])
pac, atl = set(), set()
def dfs(r, c, visit, prevHeight):
if ((r, c) in visit or
r < 0 or c < 0 or
r == ROWS or c == COLS or
heights[r][c] < prevHeight
):
return
visit.add((r, c))
dfs(r + 1, c, visit, heights[r][c])
dfs(r - 1, c, visit, heights[r][c])
dfs(r, c + 1, visit, heights[r][c])
dfs(r, c - 1, visit, heights[r][c])
for c in range(COLS):
dfs(0, c, pac, heights[0][c])
dfs(ROWS - 1, c, atl, heights[ROWS - 1][c])
for r in range(ROWS):
dfs(r, 0, pac, heights[r][0])
dfs(r, COLS - 1, atl, heights[r][COLS - 1])
res = []
for r in range(ROWS):
for c in range(COLS):
if (r, c) in pac and (r, c) in atl:
res.append([r, c])
return resWhere is the number of rows and is the number of columns.
class Solution:
def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
ROWS, COLS = len(heights), len(heights[0])
directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
pac = [[False] * COLS for _ in range(ROWS)]
atl = [[False] * COLS for _ in range(ROWS)]
def bfs(source, ocean):
q = deque(source)
while q:
r, c = q.popleft()
ocean[r][c] = True
for dr, dc in directions:
nr, nc = r + dr, c + dc
if (0 <= nr < ROWS and 0 <= nc < COLS and
not ocean[nr][nc] and
heights[nr][nc] >= heights[r][c]
):
q.append((nr, nc))
pacific = []
atlantic = []
for c in range(COLS):
pacific.append((0, c))
atlantic.append((ROWS - 1, c))
for r in range(ROWS):
pacific.append((r, 0))
atlantic.append((r, COLS - 1))
bfs(pacific, pac)
bfs(atlantic, atl)
res = []
for r in range(ROWS):
for c in range(COLS):
if pac[r][c] and atl[r][c]:
res.append([r, c])
return resWhere is the number of rows and is the number of columns.