Leetcode 36

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

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

上图是一个部分填充的有效的数独。

数独部分空格内已填入了数字,空白格用 '.' 表示。

方法:

虽然这道题目难度只是中等,但是这道题目具有相当的意义。第一遍刷题的时候我一般都会先避开这样的,随着时间的推移,我逐渐开始着手这样的题目。

首先根据对于数独的一般理解,横向、纵向不能存在重复的,而这道题目还加上了每一个3*3的九宫格也不能存在重复元素。

根据上述分析,比较自然的可以想到创建三个列表储存目标数据,然而进行比较是否存在重复元素,进而进行相关判断。

其中对于3*3的九宫格的索引值计算是一个需要思考的点:

k = (i//3)*3 + j//3

其中, i和j分别代表了数独原始的坐标

那么,根据上面的分析可以写出最终的AC解:

class Solution(object):
    def isValidSudoku(self, board):
        """
        :type board: List[List[str]]
        :rtype: bool
        """
        rows = [[] for i in range(9)]
        cols = [[] for i in range(9)]
        cells = [[] for i in range(9)]
        
        for i, row in enumerate(board):
            for j, num in enumerate(row):
                if num != '.':
                    k = (i // 3) *3 + j // 3
                    if num in rows[i] + cols[j] + cells[k]:
                        return False
                    rows[i].append(num)
                    cols[j].append(num)
                    cells[k].append(num)
        return True

最后,还需要感谢这位博主的blog,从中学到很多,特此感谢

https://blog.csdn.net/huhehaotechangsha/article/details/80538675

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值