[Tableau] B_1267. Statistiques des serveurs participant à la communication (énumération / combinaison)

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.
Insérez la description de l'image ici

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: Le ( R × C ) O (R × C)
  • Complexité de l'espace: Le ( R × C ) O (R × C)

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 0 , . . . , m , m + 1 , . . . , m + n - 1 0, ..., m, m + 1, ..., m + n-1 représente un réseauvaleurs id sont représentées, où ilj + mrepré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: Le ( ) O ()
  • Complexité de l'espace: Le ( ) O ()
Publié 714 articles originaux · loué 199 · 50 000+ vues

Je suppose que tu aimes

Origine blog.csdn.net/qq_43539599/article/details/105575028
conseillé
Classement