36、有效数独
请你判断一个
9x9
的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。- 数字
1-9
在每一列只能出现一次。- 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。数独部分空格内已填入了数字,空白格用
'.'
表示。注意:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
题目链接:https://leetcode-cn.com/problems/valid-sudoku/
思路:
我们需要创建三个二维数组来记录每一行、每一列、每一个小九宫格(序列均从0~8)中每个数字出现的次数。
-
row[i][index]
表示第i
行数字index+1
出现的次数 -
col[j][index]
表示第j
列数字index+1
出现的次数 -
box[box_num][index]
表示第box_num
个九宫格数字index+1
出现的次数 -
index
的计算:index = int(board[i][j]) - 1
-
box_num
的计算:box_num = i//3 * 3 + j//3
-
若该数字的个数已经超过1个则立即返回
False
-
board
全部扫描过后返回True
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
# 创建三个二维数组分别存放每一行每一列每一个小九宫格每个数字的个数
row = [[0]*9 for i in range(9)]
col = [[0]*9 for i in range(9)]
box = [[0]*9 for i in range(9)]
for i in range(9):
for j in range(9):
if board[i][j] != '.':
index = int(board[i][j])-1
row[i][index] += 1
col[j][index] += 1
box_num = (i//3) * 3 + (j//3)
box[box_num][index] += 1
if(row[i][index] > 1 or col[j][index] > 1 or box[box_num][index] > 1):
return False
return True