Valid Sudoku

一直以为这是个很复杂的题,其实就是哈希表找行列对角线重复就行了

class Solution(object):
    def isValidSudoku(self, board):
        """
        :type board: List[List[str]]
        :rtype: bool
        """
        n = len(board)
        m = len(board[0])
        for i in xrange(9):
            rowCheck = set()
            colCheck = set()
            for j in xrange(9):
                if board[i][j] != '.' and board[i][j] in rowCheck:
                    return False
                if board[j][i] != '.' and board[j][i] in colCheck:
                    return False
                rowCheck.add(board[i][j])
                colCheck.add(board[j][i])

        for i in xrange(0, 9, 3):
            for j in xrange(0, 9, 3):
                check = set()
                for row in xrange(i, i + 3):
                    for col in xrange(j, j + 3):
                        if board[row][col] != '.' and board[row][col] in check:
                            return False
                        check.add(board[row][col])

        return True

这道题和N皇后一样,对于特殊的查重位有很巧妙的检查方式,N皇后中是对角线的横纵坐标和差为定值,而这里我们可以根据单行里面的1到9这9个数是否有出现来检查,行列不用说了,这里对每个subbox是利用的和正常矩阵一样的方式来检查,其实就可以把subbox看成3*3的矩阵就行了,所以这里对i和j做一个特殊处理就行,很容易理解的方法

class Solution(object):
    def isValidSudoku(self, board):
        """
        :type board: List[List[str]]
        :rtype: bool
        """
        n = len(board)
        if not n:
            return False

        m = len(board[0])
        if not m:
            return False

        row = [[0] * 9 for _ in xrange(9)]
        col = [[0] * 9 for _ in xrange(9)]
        sub = [[0] * 9 for _ in xrange(9)]

        for i in xrange(n):
            for j in xrange(m):
                if board[i][j] != '.':
                    num = ord(board[i][j]) - ord('0') - 1
                    region = i / 3 * 3 + j / 3
                    if row[i][num] or col[j][num] or sub[region][num]:
                        return False
                    row[i][num], col[j][num], sub[region][num] = 1, 1, 1

        return True

results matching ""

    No results matching ""