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

你可能感兴趣的:(LeetCode)