题目描述:
一个检验数独的方法。
数独以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
将检查的部分放入了转换的循环里,按理说应该节约时间的,结果运行结果更慢了。