[Array] B_1267. Estadísticas de los servidores que participan en la comunicación (enumeración / combinación)

1. Título Descripción

Se le proporciona un mapa del centro de un servidor, representado como una cuadrícula de matriz entera am * n, donde 1 significa que en esa celda hay un servidor y 0 significa que no es un servidor. Se dice que dos servidores se comunican si están en la misma fila o en la misma columna.

Devuelve el número de servidores que se comunican con cualquier otro servidor.
Inserte la descripción de la imagen aquí

Input: grid = [[1,1,0,0],[0,0,1,0],[0,0,1,0],[0,0,0,1]]
Output: 4

En segundo lugar, la solución

Método 1: enumeración

  • Dos o más computadoras deben estar en la misma fila y columna para comunicarse entre sí.
  • Es decir, si solo hay una PC en la fila y columna de una determinada ubicación, no pueden comunicarse entre sí.
public int countServers(int[][] grid) {
    int R = grid.length, C = grid[0].length;
    int[] row = new int[R];
    int[] col = new int[C];
    int res = 0;
    for (int x = 0; x < R; x++) 
    for (int y = 0; y < C; y++) {
        if (grid[x][y] == 1) {
            row[x]++; col[y]++;
            res++;
        }
    }
    for (int x = 0; x < R; x++) 
    for (int y = 0; y < C; y++) {
        if (grid[x][y] == 1 && row[x] == 1 && col[y] == 1) {
            res--;
        }
    }
    return res;
}

Análisis de complejidad.

  • Complejidad del tiempo: El ( R × C ) O (R × C)
  • Complejidad espacial: El ( R × C ) O (R × C)

Método 2: verificar

  • Si se encuentra una cuadrícula determinada, combine la fila y la columna donde está, y count++.
  • Finalmente, encuentre solo un hijo debajo de un determinado nodo en el conjunto de búsqueda paralela uf. Si lo hay, pruebe que esta PC es independiente count--.

Q&A

  • P1: ¿Por qué se combinan las filas y columnas union(i, j+row)?
    A1, interpretación incorrecta : el rectángulo tiene m filas yn columnas, pero la matriz de id del conjunto de verificación tiene solo una fila, por lo que 0 0 , . . . , metro , metro + 1 , . . . , metro + norte - 1 0, ..., m, m + 1, ..., m + n-1 representa valores se muestran un id matriz, donde sej + mrepresenta la i-ésima fila j-ésima columna de la Identificación del índice de matriz.
int R, C;
public int countServers(int[][] grid) {
    R = grid.length; C = grid[0].length;
    int tot = 0;
    UF uf = new UF(R + C);
    for (int i = 0; i < R; i++)
    for (int j = 0; j < C; j++) {
        if (grid[i][j] == 1) {
            tot++;
            uf.union(i, j+R);
        }
    }
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < R; i++)
    for (int j = 0; j < C; j++) {
        if (grid[i][j] == 1) {
            int p = uf.find(i);
            map.put(p, map.getOrDefault(p, 0)+1);
        }
    }
    for (int k : map.keySet()) {
        if (map.get(k) == 1)
            tot--;
    }
    return tot;
}

class UF {
    int[] id;
    int count;
    
    public UF(int N) {
        id = new int[N];
        for (int i = 0; i < N; i++) {
            id[i] = i;
        }
    }
    public int find(int p) {
        while (p != id[p]) {
            p = id[p];
        }
        return p;
    }
    public boolean isConn(int p, int q) {
        return find(p) == find(q);
    }
    public void union(int p, int q) {
        int pID = find(p);
        int qID = find(q);
        if (pID == qID) {
            return;
        }
        id[pID] = qID;
        count--;
    }
}

Análisis de complejidad.

  • Complejidad del tiempo: El ( ) O ()
  • Complejidad espacial: El ( ) O ()
Publicado 714 artículos originales · elogiado 199 · 50,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_43539599/article/details/105575028
Recomendado
Clasificación