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.
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: ,
- Complejidad espacial: ,
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 representa valores se muestran un id matriz, donde sej + m
representa 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: ,
- Complejidad espacial: ,