题目:
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。
上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用 '.'
表示。
思路:
因为只能填写1~9九个数字,所以每行和每列都可以使用数组进行计数从而判断是否有重复数字,每个小九宫格我的思路是找到每个小九宫格的中点,记录其中点八个方位及其自身共九个值,而后进行判断。
leetcode最佳思路是使用3个hashmap,对行、列、小九宫格的数字个数进行记录,最后进行判定。
class Solution:
def isValidSudoku(self, board):
"""
:type board: List[List[str]]
:rtype: bool
"""
for i in range(9):
numsh =[0]*9
numsl =[0]*9
for j in range(9):
if board[i][j]!=".":
numsh[int(board[i][j])-1]+=1
if board[j][i]!=".":
numsl[int(board[j][i])-1]+=1
if i%3==1 and j%3==1:
numsf= [0]*9
for ii in (-1,0,1):
for jj in (-1,0,1):
if board[i+ii][j+jj]!=".":
numsf[int(board[i+ii][j+jj])-1]+=1
if max(numsf)>1:
return False
else:
del numsf
if max(numsh)>1 or max(numsl)>1:
return False
else:
del numsl
del numsh
return True
leetcode
class Solution:
def isValidSudoku(self, board):
"""
:type board: List[List[str]]
:rtype: bool
"""
# init data
rows = [{} for i in range(9)]
columns = [{} for i in range(9)]
boxes = [{} for i in range(9)]
# validate a board
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
# keep the current cell value
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
# check if this value has been already seen before
if rows[i][num] > 1 or columns[j][num] > 1 or boxes[box_index][num] > 1:
return False
return True