【leetcode系列】【算法】【中等】有效的数独

题目:

原题链接: https://leetcode-cn.com/problems/valid-sudoku/

 

解题思路:

按照行、列、块建立hash表

在遍历的过程中,同时检索3个表

如果在某个表中查找到当前数字,则不符合数独要求

如果没查找到,则更新3个表数据,继续遍历

 

块编号的计算方式为: 行号 / 3 + 列号 / 3 (所有计算均做取整操作)

 

代码实现:

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        rec = {'row' : {0 : [], 1 : [], 2 : [], 3 : [], 4 : [], 5 : [], 6 : [], 7 : [], 8 : [], 9 : []},\
              'column' : {0 : [], 1 : [], 2 : [], 3 : [], 4 : [], 5 : [], 6 : [], 7 : [], 8 : [], 9 : []},\
              'rect' : {0 : [], 1 : [], 2 : [], 3 : [], 4 : [], 5 : [], 6 : [], 7 : [], 8 : [], 9 : []}}
        
        for row in range(0, 9):
            for column in range(0, 9):
                rect_num = row // 3 * 3 + column // 3
                if board[row][column] == '.':
                    continue

                curr_num = int(board[row][column])
                
                if curr_num in rec['row'][row]:
                    return False
                elif curr_num in rec['column'][column]:
                    return False
                elif curr_num in rec['rect'][rect_num]:
                    return False
                
                rec['row'][row].append(curr_num)
                rec['column'][column].append(curr_num)
                rec['rect'][rect_num].append(curr_num)
                
        return True

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值