leetcode2397. Maximale Anzahl von Zeilen, die von Spalten abgedeckt werden

Inhaltsverzeichnis

Thema

Ideen

Problemlösungsmethode


Thema

https://leetcode.cn/problems/maximum-rows-covered-by-columns/description/

 Sie erhalten eine Binärmatrix  mit Indizes beginnend bei  und der Größe   . Außerdem erhalten Sie eine Ganzzahl,  die die Anzahl der verschiedenen Spalten  darstellt    , aus denen Sie auswählen müssen.m x nmatrixnumSelectmatrix

Wenn alles in einer Zeile  1 durch die von Ihnen ausgewählte Spalte abgedeckt wird, gilt die Zeile als  abgedeckt  .

Nehmen wir  formals = {c1, c2, ...., cnumSelect} an,  Sie wählen den Spaltensatz aus. Wenn für eine bestimmte Zeile in der Matrix  row die folgenden Bedingungen erfüllt sind, gilt diese Zeile als  von der Menge s abgedeckt :

  • Für  matrix[row][col] == 1 jede Zelle, die  matrix[row][col]( 0 <= col <= n - 1) erfüllt, col existiert  s in, oder
  • rowEs gibt keine1  Zelle mit  dem   Wert  .

Sie müssen Spalten aus der Matrix auswählen  numSelect , die die Anzahl der von der Menge abgedeckten Zeilen maximieren.

Gibt eine Ganzzahl zurück, die  die maximale Anzahl  von  Zeilen darstellt, die von numSelect einer Reihe von Spalten  abgedeckt werden können  .

Beispiel 1:

Eingabe: Matrix = [[0,0,0],[1,0,1],[0,1,1],[0,0,1]], numSelect = 2
 Ausgabe: 3
 Erläuterung: 
In der Abbildung dargestellt Es wurde eine Möglichkeit gefunden, 3 Reihen abzudecken. 
Wählen Sie s = {0, 2}. 
- Zeile 0 wird überschrieben, da 1 darin nicht vorkommt. 
- Zeile 1 wird überschrieben, da in s beide Spalten mit dem Wert 1 (also 0 und 2) vorhanden sind. 
- Zeile 2 wird nicht überschrieben, da Matrix[2][1] == 1, aber 1 in s nicht existiert. 
- Zeile 3 wird überschrieben, da Matrix[2][2] == 1 und 2 in s existiert. 
Somit können 3 Reihen abgedeckt werden. 
Darüber hinaus kann s = {1, 2} auch 3 Zeilen abdecken, es kann jedoch bewiesen werden, dass es nicht mehr Zeilen abdecken kann.

Beispiel 2:

Eingabe: Matrix = [[1], [0]], numSelect = 1
 Ausgabe: 2
 Erläuterung: 
Wenn nur eine Spalte ausgewählt wird, werden beide Zeilen abgedeckt, da die gesamte Matrix abgedeckt ist. 
Also geben wir 2 zurück.

Hinweis:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 12
  • matrix[i][j] Entweder ist es so  0 oder so 1
  • 1 <= numSelect <= n

Ideen


Schauen wir uns die Daten an, n<=12, damit wir alle Spaltenkombinationen durchlaufen können, dann bestimmen, wie viele Zeilen zu diesem Zeitpunkt abgedeckt sind, und die Gruppe mit den am meisten abgedeckten Zahlen behalten.

Problemlösungsmethode


Während des Schreibens des Codes haben wir Binär verwendet, um den Status zu speichern. Das Zeilenarray zeichnet die Binärzahl jeder Zeile auf. Es ist jedoch zu beachten, dass wir die symmetrische Zahl der dieser Zeile entsprechenden Binärzahl aufzeichnen Beispiel: 011, wir zeichnen als 110 auf, also 6, da wir am Ende nur die maximale Anzahl der Vorkommen zählen müssen, sodass die Aufzeichnungsform keinen Einfluss auf das Endergebnis hat.
 


class Solution {
    public int maximumRows(int[][] matrix, int numSelect) {
        int m = matrix.length,n=matrix[0].length;
        int[] row = new int[m];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                row[i] |= matrix[i][j]<<j;
            }
        }

        int cnt = 0;
        for(int i=0;i<(1<<n);i++){
            if(Integer.bitCount(i) == numSelect){
                int currentRows = 0;
                for(int j=0;j<m;j++){
                    if((row[j] & i) == row[j]) {
                        currentRows+=1;
                    }
                    cnt = Math.max(currentRows,cnt);
                }
            }
        }

        return cnt;
    }
}

Ich denke du magst

Origin blog.csdn.net/qq_51118755/article/details/135385230
Empfohlen
Rangfolge