利用二重循環的下標來表示行、列和小正方形,減少不必要的數據存儲,每一次內循環都代表着對一行或是一列或是一個小正方形的遍歷。外循環則代表對下一行,下一列和下一個小正方形的遍歷。
判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。
- 數字
1-9
在每一行只能出現一次。 - 數字
1-9
在每一列只能出現一次。 - 數字
1-9
在每一個以粗實線分隔的3x3
宮內只能出現一次。
上圖是一個部分填充的有效的數獨。
數獨部分空格內已填入了數字,空白格用 '.'
表示。
輸入:
[
["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
代碼:注意字典的鍵值對
class Solution:
def isValidSudoku(self, board):
"""
:type board: List[List[str]]
:rtype: bool
"""
row = [{},{},{},{},{},{},{},{},{}] # 值:1
col = [{},{},{},{},{},{},{},{},{}]
cell = [{},{},{},{},{},{},{},{},{}]
n = len(board)
for i in range(n):
for j in range(n):
block = 3*(i//3)+j//3 # 找單元
num = board[i][j]
if num != '.':
if num not in row[i] and num not in col[j] and num not in cell[block]:
row[i][num] = 1
col[j][num] = 1
cell[block][num] = 1
else:
return False
# print(row)
# [{'5': 1, '3': 1, '7': 1}, {'6': 1, '1': 1, '9': 1, '5': 1},
# {'9': 1, '8': 1, '6': 1}, {'8': 1, '6': 1, '3': 1},
# {'4': 1, '8': 1, '3': 1, '1': 1}, {'7': 1, '2': 1, '6': 1},
# {'6': 1, '2': 1, '8': 1}, {'4': 1, '1': 1, '9': 1, '5': 1},
# {'8': 1, '7': 1, '9': 1}]
return True
參考:
leetcode 36 Vaild Soduku(有效的數獨) python3 最簡代碼(單次循環)