Algorithmen, die Frage: spiegeln Spalten
Nehme an, dass wir eine m x n-Gitter von Nullen und Einsen und transformieren möchten Sie das Gitter so, dass die maximale Anzahl von Zeilen bestehen ausschließlich aus Einsen. Die einzige operation, die wir durchführen können, auf dem raster, ist die Kommissionierung einige Spalte und spiegeln all die Nullen und Einsen in dieser Spalte. Wir werden auch einige ganze Zahl k und durchführen müssen genau k Spalten klappt. Angesichts der Startaufstellung und der Wert von k, wie sollen wir bestimmen, welche Spalten flip zu maximieren, die Anzahl der Zeilen, die alle lieben?
Ich denke etwas Dynamik würde getan werden müssen, aber ich bin nicht in der Lage zu erreichen, eine gute Antwort. Kann mir jemand helfen?
- Ich sollte hinzufügen, dass wir nur flip alle Werte in einer Spalte zusammen.
- Warten... Mit "kippen" meinst du ersetzt die Nullen mit Einsen und Umgekehrt, oder tatsächlich drehen der Säule upside-down?
- Nein, ich meinte, dass in der 'flip ein bisschen" Sinn. So ändern Sie die 0EN zu 1en und Umgekehrt.
- emmm...., pls beziehen sich auf diese leetcode 1072
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lassen Sie uns beginnen, indem wir denken über eine wichtige detail des Problems: wenn Sie zwei Zeilen, eine Spalte enthalten, die sich quer durch die Reihen (zum Beispiel in einer Zeile ist es null, und in einer Zeile ist es eine), dann gibt es keinen möglichen Weg, um die beiden Zeilen alle diejenigen. Um dies zu sehen, nehme an, dass die Zeile x eine null in einige Spalte und Zeile y ist eine ein in dieser Spalte. Dann, wenn wir nicht flip, die Spalte, Zeile x kann nicht alle lieben, und wenn wir tun, spiegeln Sie die Spalte, dann Zeile y kann nicht alle lieben. Wenn wir also einen Blick auf die ursprüngliche matrix und versuchen zu denken, was die Zeilen machen wir alle, wir sind im Grunde nur gehen, wählen Sie eine Reihe von Zeilen, die alle gleich zu einer anderen. Unser Ziel ist dann Holen Sie den Satz von identischen Zeilen, die so groß wie möglich und kann gemacht werden in alle diejenigen, die mit genau k-flips. Lassen Sie uns sagen, dass eine Zeile, die gemacht werden können in alle diejenigen, die mit genau k flips ist ein "Kandidaten-Zeile.". Dann wir müssen Sie nur finden die Kandidaten Zeile in der matrix angezeigt wird, die größte Anzahl von Zeiten.
Den eigentlichen Algorithmus, dies zu tun, hängt davon ab, ob oder ob nicht, sind wir berechtigt, flip derselben Spalte zweimal. Wenn wir nicht, dann ein Kandidat Reihe ist eine, die genau k Nullen. Wenn wir flip derselben Spalte mehrere Male, dann ist dies ein bisschen verzwickter. Machen Sie die Zeile, in der nur Einsen, würden wir brauchen, um zu konvertieren jede null und eine eins, dann würde halten müssen, um die Ausgaben der restlichen flips, durch die in derselben Spalte zweimal, um zu vermeiden, ändern alle eine auf null. Das ist wahr, wenn der Unterschied zwischen k und der Anzahl der Nullen in der Zeile ist eine positive gerade Zahl.
Diese verwenden, erhalten wir den folgenden Algorithmus:
Insgesamt auf eine m x n matrix (m Zeilen, n Spalten), besuchen wir jede Zeile einmal. Während des Besuches machen wir O(n) arbeiten, um die Anzahl der Nullen, dann ist O(1) arbeiten, um zu sehen, ob es gültig ist. Wenn dem so ist, dauert es erwartet O(n) Zeit zum aktualisieren der hash-Tabelle, da die hashing-Schritt in O(n) Zeit, um die hash-Reihe. Dies bedeutet, dass wir verbringen O(mn) Zeit mit dem ausfüllen in der Tabelle. Schließlich ist der Letzte Schritt erfordert Zeit O(m) zu finden, die max-Frequenz der Zeile, für die eine Netto-Laufzeit von O(mn), die linear in der Größe der Eingabe. Außerdem, dies ist asymptotisch optimal, wenn da verbrachten wir weniger Zeit als wir nicht anschauen könnten al die matrix-Elemente!
Hoffe, das hilft! Dies ist ein cooles problem!
Dies möglich sein könnte code:
Wenn die k Spalten haben, anders zu sein, die Antwort ist einfach: suchen Sie die Zeile, die mit k Nullen, die tritt am häufigsten auf, und drehen Sie die Spalten zu fixieren, diese Zeilen. Wenn Sie sich umdrehen können eine Spalte mehr als einmal, finden Sie die am häufigsten auftretenden Zeile, deren Anzahl von Nullen ist nicht größer als k und hat die gleiche Parität.
Die erste Lösung funktioniert, da eine andere Methode wird nicht fix, wie viele Zeilen. Die zweite Methode funktioniert, da kann man Sie wegschmeißen jede gerade Anzahl von flips, um sich zu erholen, die Günstigste Art der Reihe, um zu versuchen zu beheben... dies tun, indem Sie spiegeln unbenutzte Spalte eine gerade Anzahl von Zeiten.
Sorry, wenn dies ist eine grobe Fehlinterpretation Ihres Problems.
Wenn Euch jemand sagt, dass die oberste Reihe muss aus vollständig 1s, dann müssen Sie die Reihenfolge aller Spalten die eine 0 an der Spitze. Ebenso für jede Zeile, können Sie sich das Muster der Spalte flips notwendig zu machen, dass eine Zeile alle 1s.
So klappt, für jede Zeile, die Muster der Spalte flips erforderlich, und finden Sie heraus, welche Muster der Spalte flips tritt Häufig auf, z.B. durch speichern einer Zählung in einer hash-Tabelle oder das ausführen sort/merge-auf die Muster (OK, teurer, aber wenn Sie Planten, die auf der dynamischen Programmierung I rechnen Sie es sich leisten können).