题目:
思路:
对于行和列的重复数字判断是比较好搞的,问题的关键在于这个3x3的小矩阵判断,涨知识的公式来了:temp = (i // 3) * 3 + j // 3
,这个公式可以将9x9的大矩阵变成9个3x3的小矩阵,大概是这样的(图有点丑,主要是为了理解题意)
先创建字典,分别为row,col,cell(存储3x3单元格),然后将除了“.”的数字存到字典的key中,value为任意值,每次都比较key值是否出现相同的,若出现则返回false。
代码如下:
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
# row为行存储,col为列存储,cell为3*3单元格存储
row = [{} for i in range(9)]
col = [{} for i in range(9)]
cell = [{} for i in range(9)]
for i in range(9):
for j in range(9):
# 获取单元格
num = board[i][j]
temp = (i // 3) * 3 + j // 3
# .不需要存储
if num != ".":
# 将不同的数存到字典的key,value为任意值(此处设置为1)
if num not in row[i] and num not in col[j] and num not in cell[temp]:
row[i][num] = "1"
col[j][num] = "1"
cell[temp][num] = "1"
# 遇到相同的key就返回False
else:
return False
return True