【力扣日记】036 有效的数独

题目描述:

一个检验数独的方法。
数独以9*9的嵌套列表描述。
规则:每行每列以及每一个以粗实线分隔的 3x3 宫内数字不能重复

算法:

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        new=[];l=[]
        for i in board:#对行的检验
            i=[x for x in i if x!='.']
            if len(set(i))!=len(i):return False
        for i in range(9):
            for j in range(9):
                l.append(board[j][i])
            new.append(l[:])
            l.clear()
        for i in new:#对列的检验
            i=[x for x in i if x!='.']
            if len(set(i))!=len(i):return False
        new.clear()
        for i in range(0,9,3):
            for j in range(0,9,3):
                for k in range(3):
                    for v in range(3):
                        l.append(board[j+k][i+v])
                new.append(l[:])
                l.clear()
        for i in new:#对小方格的检验
            i=[x for x in i if x!='.']
            if len(set(i))!=len(i):return False
        return True

执行用时 :136 ms, 在所有 python3 提交中击败了53.09%的用户

分为三步,第一步检验行,第二步,转换列表然后检验,第三步,得到小方格然后检验。
有优化空间,没必要得到完整列表再检验。

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        new=[];l=[]
        for i in board:#对行的检验
            i=[x for x in i if x!='.']
            if len(set(i))!=len(i):return False
        for i in range(9):
            for j in range(9):
                l.append(board[j][i])
            cc=[x for x in l if x!='.']
            if len(set(cc))!=len(cc):return False
            l.clear()
        for i in range(0,9,3):
            for j in range(0,9,3):
                for k in range(3):
                    for v in range(3):
                        l.append(board[j+k][i+v])
                cc=[x for x in l if x!='.']
                if len(set(cc))!=len(cc):return False
                l.clear()
        return True

将检查的部分放入了转换的循环里,按理说应该节约时间的,结果运行结果更慢了。

发布了70 篇原创文章 · 获赞 15 · 访问量 4329

猜你喜欢

转载自blog.csdn.net/Heart_for_Ling/article/details/103300840