Leetcode - 36. 有效的数独
请你判断一个
9x9的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
- 数字 1-9 在每一行只能出现一次。
- 数字 1-9 在每一列只能出现一次。
- 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.' 表示。
注意:
- 一个有效的数独(部分已被填充)不一定是可解的。
- 只需要根据以上规则,验证已经填入的数字是否有效即可。
示例 1:

输入:board =
[["5","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
输出:true
示例 2:
输入:board =
[["8","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
输出:false
解释:除了第一行的第一个数字从`5`改为`8`以外,空格内其他数字均与`示例1`相同。 但由于位于左上角的`3x3`宫内有两个`8`存在, 因此这个数独是无效的。
提示:
- board.length == 9
- board[i].length == 9
- board[i][j] 是一位数字或者 '.'
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-sudoku
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解1 2021/9/1 O(n2)
import numpy as np
def isvalid_hanglie(l:list)->bool:
# 1*9
d=dict()
for x in l:
if x=='0': return False
if x=='.': continue
if x in d.keys(): return False
d[x]=1
return True
def isvalid_unit(l:list)->bool:
# 3*3
d=dict()
for x in range(0,3):
for y in range(0, 3):
v=l[x][y]
if v == '0': return False
if v == '.': continue
if v in d.keys(): return False
d[v]=1
return True
def isValidSudoku(board: list) -> bool:
# 9行,9列,9个单元
# 情况有限,直接遍历
# 1)行
# np[0] ~ np[8]
# 2)列
# np[:,0] ~ np[:,8]
# 3)单元
# np[0:3,0:3]
# np[0:3,3:6]
# np[0:3,6:9]
# np[3:6,0:3]
# np[3:6,3:6]
# np[3:6,6:9]
# np[6:9,0:3]
# np[6:9,3:6]
# np[6:9,6:9]
grid=np.zeros(shape=(9,9),dtype=str)
for x in range(0,9):
for y in range(0,9):
grid[x][y]=board[x][y]
for x in range(0,9):
if not isvalid_hanglie(grid[x]): return False
for x in range(0,9):
if not isvalid_hanglie(grid[:,x]): return False
return isvalid_unit(grid[0:3,0:3]) and isvalid_unit(grid[0:3,3:6]) and isvalid_unit(grid[0:3,6:9])\
and isvalid_unit(grid[3:6,0:3]) and isvalid_unit(grid[3:6,3:6]) and isvalid_unit(grid[3:6,6:9]) \
and isvalid_unit(grid[6:9,0:3]) and isvalid_unit(grid[6:9,3:6]) and isvalid_unit(grid[6:9,6:9])
if __name__ == '__main__':
board =\
[["5", "3", ".", ".", "7", ".", ".", ".", "."]
, ["6", ".", ".", "1", "9", "5", ".", ".", "."]
, [".", "9", "8", ".", ".", ".", ".", "6", "."]
, ["8", ".", ".", ".", "6", ".", ".", ".", "3"]
, ["4", ".", ".", "8", ".", "3", ".", ".", "1"]
, ["7", ".", ".", ".", "2", ".", ".", ".", "6"]
, [".", "6", ".", ".", ".", ".", "2", "8", "."]
, [".", ".", ".", "4", "1", "9", ".", ".", "5"]
, [".", ".", ".", ".", "8", ".", ".", "7", "9"]]
print(isValidSudoku(board))
board =\
[["8", "3", ".", ".", "7", ".", ".", ".", "."]
, ["6", ".", ".", "1", "9", "5", ".", ".", "."]
, [".", "9", "8", ".", ".", ".", ".", "6", "."]
, ["8", ".", ".", ".", "6", ".", ".", ".", "3"]
, ["4", ".", ".", "8", ".", "3", ".", ".", "1"]
, ["7", ".", ".", ".", "2", ".", ".", ".", "6"]
, [".", "6", ".", ".", ".", ".", "2", "8", "."]
, [".", ".", ".", "4", "1", "9", ".", ".", "5"]
, [".", ".", ".", ".", "8", ".", ".", "7", "9"]]
print(isValidSudoku(board))
board =\
[["5", "3", ".", ".", "7", ".", ".", ".", "."]
, ["6", ".", ".", "1", "9", "5", ".", ".", "."]
, [".", "9", "8", ".", ".", ".", ".", "6", "."]
, ["8", ".", ".", ".", "6", ".", ".", ".", "3"]
, ["4", ".", "4", "8", ".", "3", ".", ".", "1"]
, ["7", ".", ".", ".", "2", ".", ".", ".", "6"]
, [".", "6", ".", ".", ".", ".", "2", "8", "."]
, [".", ".", ".", "4", "1", "9", ".", ".", "5"]
, [".", ".", ".", ".", "8", ".", ".", "7", "9"]]
print(isValidSudoku(board))


浙公网安备 33010602011771号