1. Titre Description
Vous obtenez une carte d'un centre serveur, représenté par une grille matricielle entière am * n, où 1 signifie que sur cette cellule il y a un serveur et 0 signifie qu'il n'y a pas de serveur. On dit que deux serveurs communiquent s'ils sont sur la même ligne ou sur la même colonne.
Renvoie le nombre de serveurs qui communiquent avec tout autre serveur.
Input: grid = [[1,1,0,0],[0,0,1,0],[0,0,1,0],[0,0,0,1]]
Output: 4
Deuxièmement, la solution
Méthode 1: dénombrement
- Deux ordinateurs ou plus doivent être dans la même ligne et colonne pour communiquer entre eux.
- C'est-à-dire que s'il n'y a qu'un seul PC dans la ligne et la colonne d'un certain emplacement, ils ne peuvent pas communiquer entre eux.
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;
}
Analyse de complexité
- Complexité temporelle: ,
- Complexité de l'espace: ,
Méthode 2: vérifier
- Si une certaine grille est rencontrée, fusionnez la ligne et la colonne où elle se trouve, et
count++
. - Enfin, ne trouvez qu'un enfant sous un certain nœud dans l'ensemble de recherche parallèle uf. S'il y en a, prouvez que ce PC est indépendant
count--
.
Q&R
- Q1: Pourquoi les lignes et colonnes fusionnées
union(i, j+row)
?
A1, mauvaise interprétation : le rectangle a m lignes et n colonnes, mais le tableau id du jeu de contrôle n'a qu'une seule ligne, donc représente un réseauvaleurs id sont représentées, où ilj + m
représente le i-ième ligne j-ième colonne de l'identifiant deindex de tableau.
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--;
}
}
Analyse de complexité
- Complexité temporelle: ,
- Complexité de l'espace: ,