LeetCode 417 — Pacific Atlantic Water Flow

Cuarto problema del patrón Graphs. Truco brillante: DFS DESDE los océanos hacia adentro, no al revés. Reduce el problema a “qué celdas alcanzan ambos océanos”.

Enunciado

Grid de elevaciones. El borde superior e izquierdo limitan con el Pacífico, el borde inferior y derecho con el Atlántico. El agua fluye de mayor a igual elevación hacia las 4 direcciones.

Devuelve las celdas desde las que el agua puede llegar a ambos océanos.


Solución — DFS inverso desde los bordes

Idea: en lugar de “puede esta celda llegar a un océano”, invertir: “qué celdas pueden ser alcanzadas desde un océano (subiendo elevación o igualándola)“.

class Solution:
    def pacificAtlantic(self, heights):
        rows, cols = len(heights), len(heights[0])
        pacific = set()
        atlantic = set()
 
        def dfs(r, c, visited, prev_height):
            if ((r, c) in visited or r < 0 or r >= rows or c < 0 or c >= cols
                    or heights[r][c] < prev_height):
                return
            visited.add((r, c))
            for dr, dc in [(1,0),(-1,0),(0,1),(0,-1)]:
                dfs(r+dr, c+dc, visited, heights[r][c])
 
        # DFS desde bordes Pacific (top + left)
        for c in range(cols):
            dfs(0, c, pacific, heights[0][c])
            dfs(rows-1, c, atlantic, heights[rows-1][c])
        for r in range(rows):
            dfs(r, 0, pacific, heights[r][0])
            dfs(r, cols-1, atlantic, heights[r][cols-1])
 
        return [[r, c] for (r, c) in pacific & atlantic]

Análisis: O(M·N).

Por qué DFS inverso

Hacer DFS desde cada celda hacia los océanos sería O((M·N)²). Empezar desde los bordes y subir convierte el problema en dos DFS de O(M·N), uno por océano. La intersección da el resultado.


Conexiones

Estado

  • Leído
  • Implementado desde cero
  • Resuelto en LeetCode