这一题按照三步走的策略,首先检查每一行是否有重复的,再检查每一列,最后检查每一块,都是按照字典去查找,代码如下:
class Solution(object):
def isValidSudoku(self, board):
"""
:type board: List[List[str]]
:rtype: bool
"""
for i in range(9):
row = {}
for j in range(9):
if board[i][j] != '.':
if board[i][j] not in row:
row[board[i][j]] = i
else:
return False
for j in range(9):
col = {}
for i in range(9):
if board[i][j] != '.':
if board[i][j] not in col:
col[board[i][j]] = j
else:
return False
for m in range(0,7,3):
for n in range(0,7,3):
blo = {}
for i in range(m,m+3):
for j in range(n,n+3):
if board[i][j] != '.':
if board[i][j] not in blo:
blo[board[i][j]] = (m,n)
else:
return False
return True
都是哈希表,但人家的代码明显好多了,代码如下:
class Solution(object):
def isValidSudoku(self, board):
row = [[] for _ in xrange(9)]
col = [[] for _ in xrange(9)]
area = [[] for _ in xrange(9)]
for i in xrange(9):
for j in xrange(9):
element = board[i][j]
if element != '.':
# calculate every sub-boxes, map to the left top element
area_left_top_id = i / 3 * 3 + j / 3
if element in row[i] or element in col[j] or element in area[area_left_top_id]:
return False
else:
row[i].append(element)
col[j].append(element)
area[area_left_top_id].append(element)
return True
网友评论