题目描述:判断一个 9x9 的数独是否有效。验证已经填入的数字即可,判断规则如下:
- 数字 1-9 每行只能出现一次
- 数字 1-9 每列只能出现一次
- 数字 1-9 在每一个以粗线划分的 3x3 宫内只能出现一次
来源:力扣(LeetCode)https://leetcode-cn.com/problems/valid-sudoku
数独部分空格内填入了数字,空白格用 “.” 来表示。
示例 :
输入 : [ [“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
思路就是按照规则进行三次查找验证,但是比较巧妙的是,这三次查找可以在一个循环里完成。另外对于使用哈希也就是字典用来计数的方法,这道题也有一个很好的示范作用。
- 第一点,想要在一个循环内完成三项查找,就要对 9 个 3x3 的子块编号,编号规则为:index = (i // 3) * 3 + j // 3
- 第二点,使用字典计数每个数字出现的次数,这里用到的字典方法 get 是这样的:dict.get (key, default=None),key 为要查找的键,而 default 为若 key 不在字典中时返回的值,这个默认值在这里被设为 0,所以当出现字典中不存在的键时,就在字典中添加该键且 value 为 1
def isValidSudoku(board):
row = [{} for _ in range(9)]
col = [{} for _ in range(9)]
block = [{} for _ in range(9)]
for i in range(9):
for j in range(9):
num = board[i][j]
b_index = (i//3)*3 + j // 3
if num != '.':
row[i][num] = row[i].get(num, 0) + 1
col[j][num] = col[j].get(num, 0) + 1
block[b_index][num] = block[b_index].get(num, 0) + 1
if row[i][num]>1 or col[j][num]>1 or block[b_index][num]>1:
return False
return True