法一:暴力法,三种情况分别枚举
class Solution(object):
def isValidSudoku(self, board):
"""
:type board: List[List[str]]
:rtype: bool
"""
for i in range(9):
s1 = {}
for j in range(9):
if board[i][j]!='.':
if board[i][j] in s1:
return False
else:
s1[board[i][j]] = 1
for i in range(9):
s2 = {}
for j in range(9):
if board[j][i] != '.':
if board[j][i] in s2:
return False
else:
s2[board[j][i]] = 1
for x in range(3):
for y in range(3):
hs = x * 3
zs = y * 3
s3 = {}
for i in range(hs,hs+3):
for j in range(zs,zs+3):
if board[i][j] != '.':
if board[i][j] in s3:
return False
else:
s3[board[i][j]] = 1
return True
法二:
class Solution(object):
def isValidSudoku(self, board):
##对于三种情况创造不同的dict
rows = [{} for i in range(9)]
columns = [{} 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 != '.':
num = int(num)
box_index = (i//3) * 3 + j//3 #对于宫格的哈希表下标的写法
rows[i][num] = rows[i].get(num,0)+1
columns[j][num] = columns[j].get(num,0)+1
boxes[box_index][num] = boxes[box_index].get(num,0) + 1
if rows[i][num] > 1 or columns[j][num] > 1 or boxes[box_index][num] > 1:
return False
return True
在leetcode判分系统中,两种方法的时间和空间复杂度相差不多