--- title: '36. Valid Sudoku' description: 'Determine if a 9 x 9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:' icon: dot topics: - { name: "Array", slug: "array" } - { name: "Hash Table", slug: "hash-table" } - { name: "Matrix", slug: "matrix" } issue: "https://github.com/prdlk/leetcode/issues/94" companies: - { name: "Amazon", period: "Thirty Days", frequency: 48.9 } - { name: "Apple", period: "Three Months", frequency: 69 } - { name: "Bloomberg", period: "Three Months", frequency: 36.8 } - { name: "Google", period: "Three Months", frequency: 23.9 } - { name: "Confluent", period: "Six Months", frequency: 100 } - { name: "Meta", period: "Six Months", frequency: 32.7 } - { name: "Microsoft", period: "Six Months", frequency: 32 } sidebar: label: 'Valid Sudoku' badge: 'Medium' --- ### Example 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` ### Example 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. ### Constraints: - `board.length == 9` - `board[i].length == 9` - board[i][j] is a digit 1-9 or '.'. ## Solution ```py import collections class Solution: def isValidSudoku(self, board: list[list[str]]) -> bool: cols = collections.defaultdict(set) rows = collections.defaultdict(set) squares = collections.defaultdict(set) # (r/3, c/3) for r in range(9): for c in range(9): if board[r][c] == ".": continue if ( board[r][c] in rows[r] or board[r][c] in cols[c] or board[r][c] in squares[(r // 3, c // 3)] ): return False cols[c].add(board[r][c]) rows[r].add(board[r][c]) squares[(r // 3, c // 3)].add(board[r][c]) return True ```