CP
LeetcodeMatrix

417. Pacific Atlantic Water Flow

class Solution:
    def pacificAtlantic(self, M: List[List[int]]) -> List[List[int]]:
        m, n = len(M), len(M[0])
        offsets = [(-1, 0), (1, 0), (0, -1), (0, 1)]
        pacific, atlantic = set(), set()

        def neighbors(y: int, x: int, ocean: Set[Tuple[int, int]]) -> Iterator[Tuple[int, int]]:
            for dy, dx in offsets:
                ny, nx = y + dy, x + dx
                if 0 <= ny < m and 0 <= nx < n and M[ny][nx] >= M[y][x] and (ny, nx) not in ocean:
                    yield (ny, nx)
        
        def dfs(i: int, j: int, ocean: Set[Tuple[int, int]]) -> None:
            ocean.add((i, j))
            for ii, jj in neighbors(i, j, ocean):
                dfs(ii, jj, ocean)
        
        for i in range(m):
            dfs(i, 0, pacific)
            dfs(i, n-1, atlantic)

        for j in range(n):
            dfs(0, j, pacific)
            dfs(m-1, j, atlantic)
        
        return list(pacific & atlantic)