LeetCode isValidSudoku Python3

本文介绍了一种高效验证数独是否有效的算法,通过一次性循环检查行、列和3x3宫内的数字重复情况,利用字典记录每个数字的出现次数,确保数字1-9在每一行、每一列和每一个3x3宫内只出现一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:判断一个 9x9 的数独是否有效。验证已经填入的数字即可,判断规则如下:

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

来源:力扣(LeetCode)https://leetcode-cn.com/problems/valid-sudoku
https://leetcode-cn.com/problems/valid-sudoku/

数独部分空格内填入了数字,空白格用 “.” 来表示。

示例 :
输入 : [ [“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

思路就是按照规则进行三次查找验证,但是比较巧妙的是,这三次查找可以在一个循环里完成。另外对于使用哈希也就是字典用来计数的方法,这道题也有一个很好的示范作用。

  • 第一点,想要在一个循环内完成三项查找,就要对 9 个 3x3 的子块编号,编号规则为:index = (i // 3) * 3 + j // 3
  • 第二点,使用字典计数每个数字出现的次数,这里用到的字典方法 get 是这样的:dict.get (key, default=None),key 为要查找的键,而 default 为若 key 不在字典中时返回的值,这个默认值在这里被设为 0,所以当出现字典中不存在的键时,就在字典中添加该键且 value 为 1
def isValidSudoku(board):
        row = [{} for _ in range(9)]
        col = [{} for _ in range(9)]
        block = [{} for _ in range(9)]
        
        for i in range(9):
            for j in range(9):
                num = board[i][j]
                b_index = (i//3)*3 + j // 3
                
                if num != '.':
                    row[i][num] = row[i].get(num, 0) + 1
                    col[j][num] = col[j].get(num, 0) + 1
                    block[b_index][num] = block[b_index].get(num, 0) + 1
                    if row[i][num]>1 or col[j][num]>1 or block[b_index][num]>1:
                        return False
        return True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值