解法一:
思路: 既然是判断横纵和每个3*3块中是否有重复的,就会想到用set,然后再分别考虑即可。我的解法时间复杂度没考虑好,空间复杂度击败98%user。
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
#1.横向扫
for i in board:
#找出所有数字
h=[j for j in i if j!='.']
if len(h)!=len(set(h)):
return False
#2.纵向扫,先转置
vborad=[[j[i] for j in board if j[i]!='.'] for i in range(9)]
for i in vborad:
#找出所有数字
h=[j for j in i]
if len(h)!=len(set(h)):
return False
#3.找3*3每个块
thrborad=[]
for i in range(9):
res=[]
for j in range(3):
res.extend(board[i//3*3:i//3*3+3][j][i%3*3:i%3*3+3])
thrborad.append(res)
for i in thrborad:
#找出所有数字
h=[j for j in i if j!='.']
if len(h)!=len(set(h)):
return False
return True
解法二:
思路: 官方答案,遍历所有9*9个数,判断每个数在行/列/子数独中是否重复出现,重复就返回false
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
#初始化 rows[0] 是一个字典
rows=[{} for i in range(9)]
cols=[{} for i in range(9)]
boxes=[{} for i in range(9)]
#遍历
for i in range(9):
for j in range(9):
num=board[i][j]
if num!='.':
#row
rows[i][num]=rows[i].get(num,0)+1
#col
cols[j][num]=cols[j].get(num,0)+1
#boxes
boxes_num=(i//3)*3+j//3
boxes[boxes_num][num]=boxes[boxes_num].get(num,0)+1
#判断是否重复
if rows[i][num]>1 or cols[j][num]>1 or boxes[boxes_num][num]>1:
return False
return True