題目描述:判斷一個 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