Leetcode 36 Valid Sudoku

Soru

Determine if a 9 x 9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:

Each row must contain the digits 1-9 without repetition. Each column must contain the digits 1-9 without repetition. Each of the nine 3 x 3 sub-boxes of the grid must contain the digits 1-9 without repetition. Note:

A Sudoku board (partially filled) could be valid but is not necessarily solvable. Only the filled cells need to be validated according to the mentioned rules.

Örnek 1

Input: board = 
[["5","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
Output: true

Örnek 2

Input: board = 
[["8","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
Output: false
Explanation: Same as Example 1, except with the 5 in the top left corner being modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid.

Çözüm

  • Bu problem, 9x9’lik bir Sudoku tahtasının geçerli olup olmadığını kontrol etmenizi ister. Geçerli bir Sudoku tahtası, her satırda, her sütunda ve her 3x3’lük alt-karede 1’den 9’a kadar rakamların tekrarlanmadan yer almasını gerektirir.

  • Bu problemi çözmek için, her satır, her sütun ve her 3x3 alt-karedeki sayıların tekrarlanıp tekrarlanmadığını kontrol etmek gerekiyor. Python’da bu kontrolü set kullanarak ve her birinin bir defaultdict içinde saklanmasını sağlayarak yapabiliriz.

  • Data Yapıları Hazırlama:cols, rows, squares adında üç defaultdict(set) oluşturulur. Bunlar sırasıyla her sütun, satır ve 3x3 alt-kare için geçerli sayıları saklar.

  • Tahta Üzerinde Dolaşma:9x9 tahtanın her bir hücresi (r, c) koordinatlarıyla dolaşılır.

  • Boş Hücre Kontrolü:board[r][c] == “.” kontrolü ile boş hücreler atlanır.

  • Geçerlilik Kontrolü:Her hücre için, o hücredeki değerin mevcut satır, sütun veya 3x3 alt-karede olup olmadığı kontrol edilir. Eğer değer zaten mevcutsa, Sudoku tahtası geçerli değildir ve fonksiyon False döndürür.

  • Setlere Değer Ekleme:Çakışma tespit edilmediyse, ilgili değer ilgili satırın, sütunun ve alt-karenin setine eklenir.

  • Sonuç:Eğer tahtada herhangi bir çakışma yoksa, döngüler tamamlandıktan sonra Sudoku geçerli kabul edilir ve True döndürülür.

  • Not : key = (r /3, c /3) Örneğin, hücre (4, 7) için:(4 // 3) = 1 ve (7 // 3) = 2 hesaplanır.Bu yöntem, her bir hücrenin hangi 3x3 alt-kare içinde bulunduğunu kolayca saptamak için etkili bir yol sağlar. Bu da, her 3x3 alt-karedeki sayıların tekrarlanmadığını kontrol etmeyi basit ve hızlı hale getirir. Bu hesaplama, her bir alt-karenin kendine özgü bir set içermesini ve dolayısıyla her birinin içindeki değerlerin benzersiz olmasını sağlar.

Code

class Solution:
    def isValidSudoku(board):
        # Satır, sütun ve 3x3 alt-kareleri takip etmek için dictionary'ler
        cols = defaultdict(set)
        rows = defaultdict(set)
        squares = defaultdict(set)  # key = (r /3, c /3)

        for r in range(9):
            for c in range(9):
                if board[r][c] == ".":
                    continue  # Boş hücreler dikkate alınmaz
                if (
                    board[r][c] in rows[r]  # Satırda aynı değerden var mı kontrol et
                    or board[r][c] in cols[c]  # Sütunda aynı değerden var mı kontrol et
                    or board[r][c] in squares[(r // 3, c // 3)]  # İlgili 3x3 alt-karede kontrol et
                ):
                    return False  # Eğer tekrar eden bir değer varsa, Sudoku geçersizdir

                # Çakışma yoksa, değeri ilgili setlere ekle
                cols[c].add(board[r][c])
                rows[r].add(board[r][c])
                squares[(r // 3, c // 3)].add(board[r][c])

        return True  # Tüm hücreler geçerliyse, Sudoku geçerlidir
        

Complexity

  • Time complexity (Zaman Karmaşıklığı): O(1), çünkü tahta her zaman 9x9’dur ve sabit sayıda işlem yapılmaktadır.
  • Space complexity (Alan Karmaşıklığı): O(1), çünkü yalnızca sabit miktarda ekstra hafıza kullanılmaktadır (27 set için).