LeetCode: 36. Valid Sudoku

LeetCode: 36. Valid Sudoku

Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:

1. Each row must contain the digits 1-9 without repetition.
2. Each column must contain the digits 1-9 without repetition.
3. Each of the 9 3x3 sub-boxes of the grid must contain the digits 1-9 without repetition.

就是判断数独是否合法,主要就是上面这三个原则。每行每列以及每3x3的小格子都不存在重复的数字。

思路

先判断9x9的格子每行每列是否重复。再判断每个3x3的小格子是否重复。算法没啥难度。主要是代码实现的一些小技巧。

Python 代码实现

class Solution:
    def isValidArray(self, array) -> bool:
        keyMap = set()
        for a in array:
            if str(a) is not '.':
                if str(a) in keyMap:
                    return False
                else:
                    keyMap.add(str(a))
        
        return True
    
    def isValidRect(self, board: List[List[str]]) -> bool:
        keyMap = set()
        for i in range(len(board)):
            row = board[i]
            for j in range(len(row)):
                if str(board[i][j]) is not '.':
                    if str(board[i][j]) in keyMap:
                        return False
                    else:
                        keyMap.add(str(board[i][j]))
        return True
            
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        allValid = True
        for i in range(len(board)):
            row = board[i]
            validRow = self.isValidArray(row)
            if validRow == False:
                allValid = False
                return allValid
                
            # 注意这里取列的方法
            cols = [row[i] for row in board]
            validCol = self.isValidArray(cols)
            if validCol == False:
                allValid = False
                return allValid
        
        row = 0
        col = 0
        while row < 9 and col < 9:
            # 取3x3的小格子的方法
            partBoard = [i[col:col+3] for i in board[row:row+3]] 
            partBoardValid = self.isValidRect(partBoard)
            if partBoardValid == False:
                return False
            col+=3
            if col == 9:
                col = 0
                row+=3
        return True

THE END.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值