[Array] B_1267. Statistik der an der Kommunikation beteiligten Server (Aufzählung / Kombination)

1. Titelbeschreibung

Sie erhalten eine Karte eines Serverzentrums, dargestellt als am * n Integer Matrix Grid, wobei 1 bedeutet, dass sich in dieser Zelle ein Server befindet und 0 bedeutet, dass es kein Server ist. Zwei Server sollen kommunizieren, wenn sie sich in derselben Zeile oder in derselben Spalte befinden.

Gibt die Anzahl der Server zurück, die mit einem anderen Server kommunizieren.
Fügen Sie hier eine Bildbeschreibung ein

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

Zweitens die Lösung

Methode 1: Aufzählung

  • Zwei oder mehr Computer müssen sich in derselben Zeile und Spalte befinden, um miteinander zu kommunizieren.
  • Das heißt, wenn sich nur ein PC in der Zeile und Spalte eines bestimmten Standorts befindet, können sie nicht miteinander kommunizieren.
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;
}

Komplexitätsanalyse

  • Zeitliche Komplexität: Die ( R. × C. ) O (R × C)
  • Raumkomplexität: Die ( R. × C. ) O (R × C)

Methode 2: Überprüfen

  • Wenn ein bestimmtes Raster gefunden wird, führen Sie die Zeile und Spalte dort zusammen, wo sie sich befinden, und count++.
  • Suchen Sie schließlich nur ein Kind unter einem bestimmten Knoten in der parallelen Suchmenge uf. Wenn ja, beweisen Sie, dass dieser PC unabhängig ist count--.

Fragen und Antworten

  • Q1: Warum werden die Zeilen und Spalten zusammengeführt union(i, j+row)?
    A1, falsche Interpretation : Das Rechteck hat m Zeilen und n Spalten, aber das ID-Array des Prüfsatzes hat also nur eine Zeile 0 , . . . , m , m + 1 , . . . , m + n - - 1 0, ..., m, m + 1, ..., m + n-1 stellt ein ArrayIDWerte angezeigt, wo esj + mden i-ten Reihej-ten Spalte des ArrayIndexID darstellt.
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--;
    }
}

Komplexitätsanalyse

  • Zeitliche Komplexität: Die ( ) O ()
  • Raumkomplexität: Die ( ) O ()
Veröffentlicht 714 Originalarbeiten · erntete Lob 199 · betrachtet 50000 +

Ich denke du magst

Origin blog.csdn.net/qq_43539599/article/details/105575028
Empfohlen
Rangfolge