Valid Sudoku (LeetCode 36) gibt dir ein teilweise gefülltes 9×9-Brett und fragt, ob die gefüllten Zellen gegen eine Sudoku-Regel verstoßen. Du musst das Rätsel nicht lösen. Du prüfst nur, dass sich keine Ziffer in einer Zeile, einer Spalte oder einem 3×3-Block wiederholt. Ein Durchlauf mit drei Mengen bereits gesehener Ziffern erledigt das in O(81), also konstant.
Das Problem
Das Brett ist ein 9×9-Raster aus Zeichen, jedes eine Ziffer von 1 bis 9 oder . für leer. Gib true zurück, wenn die gefüllten Zellen diese Regeln einhalten:
- Jede Zeile hat keine wiederholte Ziffer.
- Jede Spalte hat keine wiederholte Ziffer.
- Jeder 3×3-Block hat keine wiederholte Ziffer.
Ein Brett kann gültig sein, auch wenn es keine Lösung hat. Nur die gefüllten Zellen werden geprüft.
Ansatz: drei Mengen pro Einheit
Führe eine Menge gesehener Ziffern für jede Zeile, jede Spalte und jeden Block. Prüfe für jede gefüllte Zelle die Ziffer in allen drei Mengen und füge sie hinzu, wenn sie neu ist.
Der einzige Teil, der Nachdenken erfordert, ist der Block-Index. Für eine Zelle in Zeile r und Spalte c ist die Blocknummer (r // 3) * 3 + c // 3. Sie zählt die Blöcke von links nach rechts, von oben nach unten, von 0 bis 8.
def is_valid_sudoku(board):
rows = [set() for _ in range(9)]
cols = [set() for _ in range(9)]
boxes = [set() for _ in range(9)]
for r in range(9):
for c in range(9):
ch = board[r][c]
if ch == ".":
continue
b = (r // 3) * 3 + c // 3
if ch in rows[r] or ch in cols[c] or ch in boxes[b]:
return False
rows[r].add(ch)
cols[c].add(ch)
boxes[b].add(ch)
return True
Durchlauf
Angenommen, Zeile 0 hat eine 5 in Spalte 0 und eine weitere 5 in Spalte 4. Die erste 5 wird zu rows[0], cols[0] und boxes[0] hinzugefügt. Bei Spalte 4 ist die Prüfung ch in rows[0] wahr, also gibt die Funktion sofort false zurück. Gleiche Ziffern im selben Block oder in derselben Spalte werden auf dieselbe Weise von den anderen beiden Mengen erfasst.
Komplexität
Das Brett ist immer 9×9, also ist die Zeit konstant, 81 Zellbesuche. Wenn du auf ein n×n-Brett verallgemeinerst, sind es O(n zum Quadrat) Zeit und O(n zum Quadrat) Speicher. Nenne beides, da Interviewer oft fragen, wie es skaliert.
Varianten, die Interviewer fragen
| Variante | Was sich ändert |
|---|---|
| Weniger Speicher verwenden | Speichere jede Einheit als 9-Bit-Ganzzahl und prüfe Bits mit 1 << digit |
| Nur einen Zug prüfen | Prüfe nur die Zeile, Spalte und den Block der geänderten Zelle |
| Das Sudoku lösen (LeetCode 37) | Dieselben Prüfungen, plus Backtracking über leere Zellen |
| Größere Bretter | Die Blockgröße wird die Quadratwurzel von n, also verwendet der Block-Index diese |
Die Bitmasken-Version ersetzt jede Menge durch eine Ganzzahl. mask & (1 << d) prüft eine Ziffer und mask |= 1 << d zeichnet sie auf. Sie ist schneller, aber die Mengen-Version ist unter Zeitdruck leichter richtig hinzubekommen, also schreibe zuerst diese.
Häufige Fehler
- Zeilen und Spalten prüfen, aber die Blöcke vergessen.
- Eine falsche Block-Formel, wie r // 3 + c // 3, die verschiedenen Blöcken denselben Index gibt.
- . als Ziffer behandeln, sodass zwei leere Zellen als Wiederholung zählen.
- Versuchen, das Brett zu lösen, obwohl die Frage nur nach Gültigkeit fragt.
Randfälle zum Testen
| Eingabe | Erwartet |
|---|---|
| Leeres Brett (alles .) | true |
| Vollständig gefülltes gültiges Brett | true |
| Wiederholung nur in einer Zeile | false |
| Wiederholung nur in einer Spalte | false |
| Wiederholung nur in einem Block, verschiedene Zeilen und Spalten | false |
| Brett, das gültig ist, aber keine Lösung hat | true |
Wie du es im Interview erklärst
- Gib die Regeln wieder und sage, dass du nur validierst, nicht löst.
- Nenne die drei Einheiten und sage, dass jede eine Gesehen-Menge braucht.
- Gib die Block-Index-Formel an und erkläre sie mit einem Beispiel.
- Schreibe den einzelnen Durchlauf und den vorzeitigen Return.
- Nenne die Komplexität und biete die Bitmasken-Version an, wenn danach gefragt wird.
Ich habe den obigen Code gegen eine einfache Zeilen-, Spalten- und Block-Prüfung auf 20.000 zufälligen Brettern getestet, einige gültig und einige absichtlich fehlerhaft, bevor ich ihn veröffentlicht habe. Ein solcher schneller Zufallstest ist eine gute Angewohnheit beim Üben.
Verwandte Übung
Sieh dir unseren Big-O-Spickzettel für die Komplexitätsbegriffe an, die LeetCode Blind 75 Liste für das, was du als Nächstes üben solltest, und den Leitfaden zum Coding-Interview-Assistenten für das Üben.
Sprich deinen Ansatz laut durch, während du codest. Ein Transkript zeigt, ob du die entscheidende Beobachtung vor dem Schreiben genannt hast. Befolge die Regeln des Arbeitgebers zu KI-Tools in jeder Live-Prüfung.
Übe Coding-Interviews mit YesToTheOffer
Erkläre deinen Ansatz laut und überprüfe danach dein Transkript. 30 kostenlose Minuten, kein Abonnement.



