判斷乙個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。
數字 1-9 在每一行只能出現一次。
數字 1-9 在每一列只能出現一次。
數字 1-9 在每乙個以粗實線分隔的 3x3 宮內只能出現一次。
數獨部分空格內已填入了數字,空白格用 『.』 表示。
示例 1:
輸入:[
[「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:
輸入:[
[「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 存在, 因此這個數獨是無效的。
說明:乙個有效的數獨(部分已被填充)不一定是可解的。
只需要根據以上規則,驗證已經填入的數字是否有效即可。
給定數獨序列只包含數字 1-9 和字元 『.』 。
給定數獨永遠是 9x9 形式的。
官方題解講得很清楚了,主要思路就是對每一行每一列和每一塊都建立字典,然後一次遍歷,根據是否有重複的進行判斷:
class
solution
:def
isvalidsudoku
(self, board)
:"""
:type board: list[list[str]]
:rtype: bool
"""x_dict =
[for x in
range(9
)]# 9行
y_dict =
[for y in
range(9
)]# 9列
box_dict =
[for box in
range(9
)]# 從左到右從上到下9塊
for i in
range(9
):for j in
range(9
):try:
num =
int(board[i]
[j])
box_index =
(i //3)
*3+ j //
3 x_dict[i]
[num]
= x_dict[i]
.get(num,0)
+1if x_dict[i]
[num]
>1:
return
false
y_dict[j]
[num]
= y_dict[j]
.get(num,0)
+1if y_dict[j]
[num]
>1:
return
false
box_dict[box_index]
[num]
= box_dict[box_index]
.get(num,0)
+1if box_dict[box_index]
[num]
>1:
return
false
except valueerror:
pass
return
true
優化一下:class
solution
:def
isvalidsudoku
(self, board)
:"""
:type board: list[list[str]]
:rtype: bool
"""x_list =[[
]for x in
range(9
)]# 9行
y_list =[[
]for y in
range(9
)]# 9列
box_list =[[
]for box in
range(9
)]# 從左到右從上到下9塊
for i in
range(9
):for j in
range(9
):try:
num =
int(board[i]
[j])
box_index =
(i //3)
*3+ j //
3if num in x_list[i]
+ y_list[j]
+ box_list[box_index]
:return
false
# 先判斷後新增
x_list[i]
y_list[j]
box_list[box_index]
except valueerror:
pass
return
true
LeetCode 36 有效的數獨
題目鏈結 題目描述 判斷乙個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。數字 1 9 在每一行只能出現一次。數字 1 9 在每一列只能出現一次。數字 1 9 在每乙個以粗實線分隔的 3x3 宮內只能出現一次。上圖是乙個部分填充的有效的數獨。數獨部分空格內已填入了數字...
LeetCode 36 有效的數獨
public boolean isvalidsudoku char board 檢查行 if isparticallyvalid board,i,i,0,8 檢查塊 for int i 0 i 3 i return true 把要檢查的值存入到set中,每次向set中新增值的時候,如果失敗則證明該值...
LeetCode36 有效的數獨
判斷乙個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。數字 1 9 在每一行只能出現一次。數字 1 9 在每一列只能出現一次。數字 1 9 在每乙個以粗實線分隔的 3x3 宮內只能出現一次。上圖是乙個部分填充的有效的數獨。數獨部分空格內已填入了數字,空白格用 表示。示...