El problema "número de islas" es un desafío comúnmente planteado en entrevistas de trabajo de empresas tecnológicas de renombre como Google, Microsoft y Amazon para evaluar habilidades de programación. En esencia, este problema consiste en determinar cuántas "islas" existen en una matriz compuesta por números 1 y 0. En este contexto, el 1 representa la tierra y el 0 el agua. La misión es contar los grupos conectados de tierra, es decir, las islas.
Estrategias para resolver el problema
Resolver este problema requiere una comprensión sólida de búsqueda en profundidad, comúnmente conocida como DFS (Depth First Search). Esta técnica ayuda a identificar cuántas islas hay, navegando a fondo en cada célula de tierra descubierta hasta que se rodee completamente de agua.
¿Cómo se navega en el mapa?
Para abordar el problema, es esencial realizar iteraciones a lo largo de la matriz, explorando cada célula y distinguiendo entre agua y tierra. La lógica parte de un enfoque de búsqueda en profundidad, comenzando desde la primera célula, y extendiéndose a cada célula adyacente que también sea tierra.
¿Cuándo se considera que estamos en una isla?
Una isla se forma solo cuando un conjunto de células de tierra está rodeado por todas partes de agua. Como cada célula de tierra conectada contribuye a una misma isla, es crucial controlar estas conexiones para determinar el límite de cada isla.
¿Cómo implementar una solución con DFS?
Para resolver este problema, una solución efectiva es usar la búsqueda en profundidad (DFS). Este algoritmo permite explorar completamente cada conjunto de tierra, utilizando una función recursiva que se mantiene mientras haya tierra para recorrer.
defnumIslands(grid):ifnot grid:return0defdfs(i, j):if i <0or i >=len(grid)or j <0or j >=len(grid[0])or grid[i][j]=="0":return grid[i][j]="0"# Marcar como visitado dfs(i+1, j) dfs(i-1, j) dfs(i, j+1) dfs(i, j-1) count =0for i inrange(len(grid)):for j inrange(len(grid[0])):if grid[i][j]=="1": dfs(i, j) count +=1# Incrementar el contador para cada isla encontradareturn count
Complejidad del algoritmo
La solución mediante DFS tiene una complejidad de tiempo y espacio de (O(n^2)), donde (n) es la dimensión del mapa si se asume que es cuadrado. Esto se debe a que el algoritmo debe explorar cada célula en la cuadrícula para determinar la cantidad de islas, almacenando temporalmente el estado de cada celda en la pila de la recursión.
¡Explora distintas maneras de resolver este problema! Cada enfoque podría ofrecer una perspectiva única sobre estructuras de datos y algoritmos, lo que enriquecerá tu experiencia y habilidades de programación.
Espero que les ayude a entender la búsqueda de las islas
def num_islas(m): visited =set() def dfs(r: int,c: int): # Si las coordenadas ya fueron visitadas
if(r,c)invisited:return0 visited.add((r,c)) # Consideramos1 pedazo de tierra como 1 isla
count =1 # Nos protegemos de los bordes
# Nos movemos en la isla sólo si hay tierra "1" # Derechaif r +1<len(m) and m[r +1][c]=="1":dfs(r +1, c) # Izquierdaif r >0 and m[r -1][c]=="1":dfs(r -1, c) # Arribaif c >0 and m[r][c -1]=="1":dfs(r, c -1) # Abajoif c +1<len(m[0]) and m[r][c +1]=="1":dfs(r, c +1) # Ya que se revisaron todos los lados y no hay mas movimiento
return count
total_islas =0for r inrange(len(m)):for c inrange(len(m[0])):if(r,c) not in visited and m[r][c]=="1": total_islas +=dfs(r, c)return total_islas
Pongo por aca mi solucion ya que no las hago en los Playgrounds porque requieren Python y no se Python, todo lo estoy haciendo con JavaScript.
Recursos que utilice:
- Copilot, por supuesto, pero ojo su uso no fue para que proporcionara directamente el resultado o solucionara los problemas que tuviera de manera facil. Fue usado para que me diera "pistas" sin proporcionar la solucion, para que yo mismo pudiera solucionarlo por mi propia cuenta.
- Este video en Youtube:
Me ayudo a entender que habia que hacer y ofrece una solucion usando dfs en Python, que tambien el codigo proporcionado en Python pude algo implementarlo en JavaScript.
Yo no usé dfs y tengo que ver cuál es la complejidad, pero estoy casi seguro que usamos menos espacio y menos tiempo
My pseudo código es difícil de leer entonces tal vez lo haga en js y luego lo pongo en los comentarios
// pseudo código// lista de islas por ejemplo// listaDeIslas = \[// \[\[0,0],\[0,1],\[1,0],\[1,1]],// \[\[2,2]]// ]if coordenadaActual == tierra
  tierraAdyacente = buscar adyacentes que son tierra
 if coordenadaActual es tierra pero no tiene tierra adyacente(tierraAdyacente.length==0)  listaDeIslas.push(\[coordenadaActual]) return  islaDeLaCoordenadaAdyacente = buscar si al menos una de las tierras adyacentes ya fueron agregadas a la lista listaDeIslas
 if!islaDeLaCoordenadaAdyacente
 // si no se ha creado la isla entonces la creamos  listaDeIslas.push(\[coordenadaActual]) else // si ya existe la isla entonces añadimos la coordenada actual  islaDeLaCoordenadaAdyacente.push(coordenadaActual)else  continuar