Contenido del curso
DFS
- 6

Cómo recorre nodos el algoritmo DFS
04:49 min - 7

Implementación de DFS recursivo para búsqueda en árboles
12:10 min - 8

Búsqueda en Profundidad (DFS) para Grafos: Enfoque Iterativo y Recursivo
01:27 min - 9

Inorder, Preorder y Postorder en árboles
07:09 min - 10

Suma de caminos raíz a hoja en árboles
02:04 min - 11

Suma de caminos raíz a hoja con DFS
07:31 min - 12

Playground: Sum Root to Leaf Numbers
- 13

Implementación de Algoritmo DFS en Árboles Binarios con Golang
15:03 min - 14

Número de islas con DFS en matrices
02:32 min - 15

Problema de islas resuelto con DFS
Viendo ahora - 16

Playground: Number of Islands
- 17

Número de islas con DFS recursivo en Python
10:18 min - 18

Ejercicios Prácticos de Búsqueda en Profundidad (DFS)
02:22 min - 19

Algoritmos de Búsqueda en Profundidad (DFS) en Problemas Comunes
06:19 min
BFS
- 20

Cómo BFS recorre grafos por niveles
02:05 min - 21

Implementación de BFS con colas en Python
08:42 min - 22

Mínimos movimientos del caballo en ajedrez
02:55 min - 23

Minimum Knight's Move con BFS
08:11 min - 24

Playground: Minimum Knights Moves
- 25

Resolución de Problemas de Caballos de Ajedrez con BFS en Python
17:49 min - 26

Propagación BFS en Rotting Oranges
03:50 min - 27

Resolución de Rotting Oranges usando BFS
08:43 min - 28

Playground: Rotting Oranges
- 29

Implementación de BFS para naranjas podridas
23:44 min - 30

Puente más corto entre islas con BFS
03:38 min - 31

Shortest Bridge: combina DFS y BFS
07:35 min - 32

Playground: Shortest Bridge Between Islands
- 33

Shortest Bridge con DFS y BFS en Python
14:57 min - 34

Búsqueda en anchura: Ejercicios prácticos y aplicaciones
03:41 min - 35

Ejercicios avanzados de búsqueda en anchura (BFS) en programación
08:47 min
Backtrack
- 36

Backtracking para encontrar soluciones válidas
04:20 min - 37

Combinaciones de letras en teclado telefónico
01:51 min - 38

Combinaciones de teclado con backtracking
09:19 min - 39

Generación de combinaciones de letras con teclados numéricos en C++
14:08 min - 40

Playground: Letter Combinations of a Phone Number
- 41

Generación de Direcciones IP Válidas a partir de Cadenas Numéricas
03:51 min - 42

Backtracking para generar IPs válidas
28:16 min - 43

Playground: Restore IP Addresses
- 44

Búsqueda de Palabras en Matrices: Solución y Complejidad
02:54 min - 45

Word Search con DFS y backtracking
08:30 min - 46

Playgrund: Word Search
- 47

Búsqueda de palabras en matrices con DFS
18:18 min - 48

Resolución del problema de las n reinas en ajedrez
01:08 min - 49

Ejercicios de Backtracking: Combinaciones y Permutaciones
01:05 min - 50

Combinaciones y Permutaciones con Backtracking
02:14 min
Próximos pasos
Problema de islas resuelto con DFS
Resumen
El problema de número de islas es uno de los favoritos en entrevistas técnicas de Google, Microsoft, Amazon y Facebook, y entender cómo resolverlo con DFS te abre la puerta a pensar cualquier matriz como un grafo. Aquí desglosamos la lógica paso a paso para que sepas atacarlo cuando te lo pregunten.
¿Qué pide el problema de número de islas?
Imagina una matriz llena de unos y ceros. Los unos representan tierra, los ceros representan agua, y tu misión es contar cuántas islas existen. Una isla es un grupo de tierra rodeado completamente por agua.
Lo interesante aparece cuando dejas de ver la matriz como números y empiezas a verla como un mapa. Si tienes un tablero pequeño, puedes contar a simple vista. Pero si te dan un mapa del mundo entero, necesitas un algoritmo que recorra cada celda con criterio.
¿Qué cuenta como una isla en este problema? Un grupo de celdas con valor 1 que están conectadas entre sí por arriba, abajo, izquierda o derecha. Si están separadas por agua, son islas distintas.
¿Por qué una matriz se puede tratar como un grafo?
Aquí está el giro mental clave. Un grafo tradicional se ve como nodos y relaciones explícitas. Pero una matriz también es un grafo: cada celda es un nodo y sus vecinos (arriba, abajo, izquierda, derecha) son sus relaciones [01:20].
Esto significa que técnicas como recorrido en profundidad o en anchura no solo sirven para estructuras de datos complejas. Sirven cada vez que tengas elementos con vecinos definidos, incluso si tu input es un simple arreglo bidimensional.
¿Cómo recorremos el mapa con DFS?
La estrategia es usar Depth First Search: te metes en una dirección hasta que ya no puedas avanzar, y entonces retrocedes a explorar las otras direcciones [03:10]. Aplicado al mapa, significa que cuando encuentras tierra, te adentras en esa isla hasta agotar todas las celdas conectadas antes de seguir buscando.
Gráficamente, recorres la matriz celda por celda haciendo paradas y comparaciones según el estado de cada posición.
¿Cómo se manejan los estados de tierra y agua?
Tienes dos estados posibles: agua o tierra. Y según en cuál estés, el algoritmo hace cosas distintas.
- Si estás en agua (cero), simplemente avanzas a la siguiente celda.
- Si estás en tierra (uno), revisas si las celdas adyacentes también son tierra para saber si pertenecen a la misma isla.
- Si todos los bordes alrededor de tu zona de tierra son agua, terminaste de mapear esa isla.
La condición de cierre no es encontrar un solo cuadrito de agua. Es que todo el contorno de tu pedazo de tierra sea agua. Solo ahí cuentas una isla completa.
¿Cuándo dejo de explorar una isla? Cuando todas las celdas adyacentes a la zona de tierra que estás recorriendo son agua o están fuera del mapa. Ese es el borde real de la isla.
¿Qué pasa con las diagonales?
Un detalle que vale la pena preguntar en la entrevista: ¿las diagonales cuentan como adyacentes? El planteo estándar considera solo arriba, abajo, izquierda y derecha, pero confirmar este supuesto demuestra criterio [05:00].
¿Cómo se estructura el algoritmo final?
La solución combina dos piezas: una función grande que itera la matriz completa, y una función auxiliar que hace DFS cada vez que encuentra tierra.
- Recorres cada celda de la matriz con dos bucles anidados.
- Si la celda vale 0, sigues iterando.
- Si la celda vale 1, llamas a la función DFS que marca toda la isla conectada.
- Cada vez que termina una llamada a DFS, sumas 1 al contador de islas.
- Cuando recorriste todo el tablero, el contador tiene la respuesta.
Esa función DFS se llama recursivamente sobre las cuatro direcciones posibles desde cada celda de tierra, marcando lo visitado para no contar la misma isla dos veces.
¿Cuál es la complejidad de la solución?
La complejidad temporal es N al cuadrado, donde N es el ancho o largo de la matriz si asumimos un tablero cuadrado [07:30]. Esto se debe a que tienes que visitar cada celda al menos una vez.
La complejidad espacial también es N al cuadrado. La razón está en la recursión: cada llamada a DFS dentro de DFS agrega un frame a la pila de memoria. En el peor caso, si toda la matriz es una sola isla gigante, la pila guarda información de cada celda visitada.
¿Por qué la recursión consume memoria? Cada llamada recursiva guarda su contexto en la pila para poder regresar al punto anterior cuando termina. Si llamas DFS dentro de DFS muchas veces, esa pila crece proporcionalmente.
¿Hay otras formas de resolver el problema?
DFS no es la única vía. También puedes usar BFS recorriendo por niveles con una cola, o estructuras como Union Find para agrupar celdas conectadas. Cada enfoque tiene trade-offs distintos en memoria y claridad.
Cuéntame en los comentarios cómo lo abordarías tú, qué subproblemas identificas y si conoces alguna variante que optimice memoria o tiempo.