LeetCode刷题之36.有效的数独
我不知道将去向何方,但我已在路上! |
---|
时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 ! |
-
题目:
判断一个 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):
# 判断方格里面数据是否冲突
for i in range(1,8,3):
for j in range(1,8,3):
a,b = [],[]
for x in range(i-1,i+2):
for y in range(j-1,j+2):
a.append(board[x][y])
for t in filter(lambda x: x != ".", a):
b.append(int(t))
if sum(b) == sum(set(b)):
continue
if sum(b) != sum(set(b)):
return(False)
# 判断每列数据是否冲突
for i in range(9):
a,b = [],[]
for j in range(9):
a.append(board[j][i])
for t in filter(lambda x: x != ".", a):
b.append(int(t))
if sum(b) == sum(set(b)):
continue
if sum(b) != sum(set(b)):
return False
# 判断每行数据是否冲突
for i in range(9):
a = []
board[i] = filter(lambda x: x != ".", board[i])
for t in board[i]:
a.append(int(t))
if sum(a) == sum(set(a)):
continue
if sum(a) != sum(set(a)):
return False
return(True)
# 执行用时 :124 ms, 在所有 Python 提交中击败了29.18%的用户
# 内存消耗 :11.8 MB, 在所有 Python 提交中击败了14.45%的用
- 算法说明:
程序的主要思想是将每个判断元(每行、每列、每个3x3方格)里面的数据用set函数去重,然后用sum函数求和,与不去重求出的和比较是否相等,如果相等说明没有重复的元素,返回True,否则说明有重复元素,返回False。
(1)第一个for循环,判断在每个3x3的方格里面的数据是否有冲突,用两层for循环找到每个方格的中心(1、4、7),(注意:设置遍历间隔为3),将中心元素及周围的9个元素找到(中心元素索引各加减1),用filter函数将其中的 ‘.’ 字符滤除掉,将数据转换为int型,然后去重、求和、比较;
(2)第二个for循环,判断每列的数据是否有冲突,用两层for循环找到每列的元素,然后用filter函数将其中的 ‘.’ 字符滤除掉,将数据转换为int型,然后去重、求和、比较;
(3)第三个for循环,判断每行的数据是否有冲突,用一层for循环找到每行的元素,然后用filter函数将其中的 ‘.’ 字符滤除掉,将数据转换为int型,然后去重、求和、比较。