Leetcode 36. Valid Sudoku
Explanation for Leetcode 36 - Valid Sudoku, and its solution in Python.
Problem
Example:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
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.
Approach
We can solve this problem by having HashSet of each ‘row’, ‘col’, and ‘sq’
For each HashSet, if board[i][j] exists then we can return False
If we finish looping through the SudoKu board, then we can return True
Here is the Python code for the solution:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
rows = defaultdict(set)
cols = defaultdict(set)
sq = defaultdict(set)
for i in range(9):
for j in range(9):
if board[i][j] == '.':
continue
if board[i][j] in rows[i] or board[i][j] in cols[j] or board[i][j] in sq[(i//3, j//3)]:
return False
rows[i].add(board[i][j])
cols[j].add(board[i][j])
sq[(i//3, j//3)].add(board[i][j])
return True
Time Complexity and Space Complexity
Time Complexity: $O(n^2)$
Space Complexity: $O(n^2)$
This post is licensed under CC BY 4.0 by the author.