LeetCode刷题之36.有效的数独

LeetCode刷题之36.有效的数独

我不知道将去向何方,但我已在路上!
时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 !
  • 题目
    判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

    1. 数字1-9在每一行只能出现一次。
    2. 数字1-9在每一列只能出现一次。
    3. 数字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型,然后去重、求和、比较。
发布了90 篇原创文章 · 获赞 1 · 访问量 1048

猜你喜欢

转载自blog.csdn.net/qq_34331113/article/details/102772689