问题描述

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

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

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

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

示例 1:

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

输入: [ [“8”,“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”] ] 输出: false 解释: 除了第一行的第一个数字从 5
改为 8 以外,空格内其他数字均与 示例1 相同。
但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。 说明:

一个有效的数独(部分已被填充)不一定是可解的。 只需要根据以上规则,验证已经填入的数字是否有效即可。 给定数独序列只包含数字 1-9 和字符
‘.’ 。 给定数独永远是 9x9 形式的。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/valid-sudoku
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1.1遍历法

  分别遍历行列和块是否均 满足 不存在重复元素

1.2代码
# -*- coding: utf-8 -*-
'''
问题简述:
    给定一个二维列表,可以视为一个数独,判断是否为一个有效数独。
    即每行/列/块是否不存在重复元素。
基本思路:
    分别遍历行/列/块是否存在重复元素。即原来长度是否等于集合的长度。
'''
class Solution():
    '''
    input: list
    output: bool
    '''
    def isValid(self,nums):
        rows = [[] for i in range(9)]     # save 行
        colums = [[] for i in range(9)]   # save 列
        blocks = [[] for i in range(9)]   # save 块
        for I in range(9):                # 遍历每行
            for J in range(9):            # 遍历每列
                if nums[I][J] == '.':
                    continue
                else:
                    rows[I].append(nums[I][J])
                    colums[J].append(nums[I][J])
                    blocks[I//3*3+J//3].append(nums[I][J]) # 多找找规律即可
        for B in rows,colums,blocks:
            for sublist in B:
                if not len(sublist) == len(set(sublist)):
                    return False
        return True
if __name__ == '__main__':
    ilist =\
    [
        ["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"]
    ]

    solu = Solution()
    res = solu.isValid(ilist)
    print('最终结果为:\n',res)
总结

a. 第25行代码中:blocks的推演。以及26行遍历的写法值得注意下。B是一个包含三个字列表的列表