Inhaltsverzeichnis
Thema
https://leetcode.cn/problems/maximum-rows-covered-by-columns/description/
Sie erhalten eine Binärmatrix mit Indizes beginnend bei 0 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 n
matrix
numSelect
matrix
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, diematrix[row][col]
(0 <= col <= n - 1
) erfüllt,col
existierts
in, oder row
Es 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 so0
oder so1
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;
}
}