Categorías
Algorithms

LeetCode – Número de islas II (Java)

Un mapa de cuadrícula 2d de m filas yn columnas se llena inicialmente con agua. Podemos realizar una operación addLand que convierte el agua en la posición (fila, col) en una tierra. Dada una lista de posiciones para operar, cuente el número de islas después de cada operación addLand. Una isla está rodeada de agua y se forma conectando tierras adyacentes horizontal o verticalmente. Puede suponer que los cuatro bordes de la cuadrícula están rodeados de agua.

Solución Java

Use una matriz para rastrear el nodo principal de cada celda.

public List<Integer> numIslands2(int m, int n, int[][] positions) {
    int[] parent = new int[m * n];
    Arrays.fill(parent,-1);
 
    ArrayList<Integer> result = new ArrayList<>();
 
    int[] dx = {-1, 0, 1, 0};
    int[] dy = {0, 1, 0, -1};
 
    int count = 0;
    for (int[] position : positions) {
        count++;
        int idx = n * position[0] + position[1];
 
        if (parent[idx] == -1) {
            parent[idx] = idx;
        }
 
        for (int k = 0; k < 4; k++) {
            int x = position[0] + dx[k];
            int y = position[1] + dy[k];
 
            int idxNeighbor = n * x + y;
 
            if (x >= 0 && x < m && y >= 0 && y < n && parent[idxNeighbor] != -1) {
                int p = getParent(parent, idxNeighbor);
 
                //set neighor's parent to be current idx
                if (parent[p] != idx) {
                    parent[p] = idx;
                    count--;
                }
            }
        }
 
        result.add(count);
    }
 
    return result;
}
 
private int getParent(int[] parent, int i) {
    while (parent[i] != i) {
        i = parent[i];
    }
 
    return i;
}
  LeetCode - Partición a subconjuntos de suma igual K (Java)

Complejidad de tiempo O (k * log (m * n)), donde k es la longitud de las posiciones.

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *