简介
今天做力扣每日一题,判断是否是有效的数独时,按照每个条件查找一次的情况来分析,耗时较长。
从官方题解中看到这样一句话,可以分别按照三种情况(判断数独是否合理的三个条件)有效的保存每个元素出现的次数。
记录并学习一下它的用法。
record = {0: defaultdict(set), 1: defaultdict(set), 2: defaultdict(set)}
力扣第36题
题目
请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
注意:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
分析
1. 双重遍历,按每个条件查找
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
import numpy as np
board = np.array(board)
for i in range(9):
hang = board[i,:]
for j in range(9):
for k in range(9):
if hang[k] == hang[j] and hang[k] != '.' and k != j:
return 0>1
lie = board[:,i]
for j in range(9):
for k in range(9):
if lie[k] == lie[j] and lie[k] != '.' and k != j:
return 0>1
for i in range(3):
for j in range(3):
test = board[3*i:(3*i+3),(3*j):(3*j+3)]
test = np.reshape(test,(9,1))
for j in range(9):
for k in range(9):
if test[k] == test[j] and test[k] != '.' and k != j:
return 0>1
return 1>0
2. 遍历一次,记录每个元素出现的次数
from collections import defaultdict
import math
def isValidSudok(board):
# 0: row, 1: column, 2: square
record = {0: defaultdict(set), 1: defaultdict(set), 2: defaultdict(set)}
n = len(board)
m = math.sqrt(n)
for i in range(n):
for j in range(n):
if board[i][j] == '.':
continue
if board[i][j] in record[0][i] or board[i][j] in record[1][j]:
return False
sq = i // m * m + j // m
if board[i][j] in record[2][sq]:
return False
record[0][i].add(board[i][j])
record[1][j].add(board[i][j])
record[2][sq].add(board[i][j])
return True
board = [[".",".",".",".","5",".",".","1","."],[".","4",".","3",".",".",".",".","."],[".",".",".",".",".","3",".",".","1"],["8",".",".",".",".",".",".","2","."],[".",".","2",".","7",".",".",".","."],[".","1","5",".",".",".",".",".","."],[".",".",".",".",".","2",".",".","."],[".","2",".","9",".",".",".",".","."],[".",".","4",".",".",".",".",".","."]]
res = isValidSudok(board)
print(res)
总结
defaultdict与普通的字典的区别
当我使用普通的字典时,用法一般是dict={},添加元素的只需要dict[element] =value即,调用的时候也是如此,dict[element] = xxx,但前提是element字典里,如果不在字典里就会报错,如:
这时defaultdict就能排上用场了,defaultdict的作用是在于,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值。
如何使用defaultdict
defaultdict接受一个工厂函数作为参数,如下来构造:
dict = defaultdict( factory_function)
这个factory_function可以是list、set、str等等,作用是当key不存在时,返回的是工厂函数的默认值,比如list对应[ ],str对应的是空字符串,set对应set( ),int对应0.
举例:
from collections import defaultdict
dict1 = defaultdict(int)
dict2 = defaultdict(set)
dict3 = defaultdict(str)
dict4 = defaultdict(list)
dict1[2] ='two'
print(dict1[1])
print(dict2[1])
print(dict3[1])
print(dict4[1])
输出:
0
set()
[]