美文网首页
LeetCode 数组 有效的数独

LeetCode 数组 有效的数独

作者: Eddiehe212 | 来源:发表于2018-08-12 12:43 被阅读0次

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
image

上图是一个部分填充的有效的数独。

数独部分空格内已填入了数字,空白格用 '.' 表示。

输入:
[
["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

解答:
这道题相对来讲稍微难一点,需要考虑多种情况,判断行,判断列,判断3x3的块。

class Solution:
    """
        :type board: List[List[str]]
        :rtype: bool
    """
    import collections
    def isValidSudoku(self, board):
        ## check row
        for i in range(9):
            dic1 = collections.Counter(board[i])
            for k,v in dic1.items():
                if k!='.' and v>1:
                    return False
        ## check column
        for j in range(9):
            dic2 = collections.Counter([x[j] for x in board])
            for k,v in dic2.items():
                if k!='.' and v>1:
                    return False
        
        ## check block
        for i in range(9):
            for j in range(9):
                ## 关键在于这个部分,当i和j为0,3,6的时候,判断block是否有效
                if i%3==0 and j%3==0:
                    if not Solution.checkblock(board,i,j):
                        return False
        return True
    
    def checkblock(board,r,c):
        dic = {}
        for i in range(r,r+3):
            for j in range(c,c+3):
                if board[i][j]!='.':
                    if board[i][j] in dic:
                        return False
                    dic[board[i][j]]=1
        return True

相关文章

网友评论

      本文标题:LeetCode 数组 有效的数独

      本文链接:https://www.haomeiwen.com/subject/hudsbftx.html