LC 有效的数独

传送门

解法一:

思路: 既然是判断横纵和每个3*3块中是否有重复的,就会想到用set,然后再分别考虑即可。我的解法时间复杂度没考虑好,空间复杂度击败98%user。

class Solution:
        
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        #1.横向扫
        for i in board:
            #找出所有数字
            h=[j for j in i if j!='.']
            if len(h)!=len(set(h)):
                return False
        #2.纵向扫,先转置
        vborad=[[j[i] for j in board if j[i]!='.'] for i in range(9)]
        for i in vborad:
            #找出所有数字
            h=[j for j in i]
            if len(h)!=len(set(h)):
                return False
        #3.找3*3每个块
        thrborad=[]
        for i in range(9):
            res=[]
            for j in range(3):
                res.extend(board[i//3*3:i//3*3+3][j][i%3*3:i%3*3+3])
            thrborad.append(res)

        for i in thrborad:
            #找出所有数字
            h=[j for j in i if j!='.']
            if len(h)!=len(set(h)):
                return False

        return True

解法二:

思路: 官方答案,遍历所有9*9个数,判断每个数在行/列/子数独中是否重复出现,重复就返回false

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        #初始化 rows[0] 是一个字典
        rows=[{} for i in range(9)]
        cols=[{} for i in range(9)]
        boxes=[{} for i in range(9)]

        #遍历
        for i in range(9):
            for j in range(9):
                num=board[i][j]
                if num!='.':
                    #row
                    rows[i][num]=rows[i].get(num,0)+1
                    #col
                    cols[j][num]=cols[j].get(num,0)+1
                    #boxes
                    boxes_num=(i//3)*3+j//3
                    boxes[boxes_num][num]=boxes[boxes_num].get(num,0)+1

                    #判断是否重复
                    if rows[i][num]>1 or cols[j][num]>1 or boxes[boxes_num][num]>1:
                        return False

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值