题目
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/valid-sudoku
请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
注意: 一个有效的数独(部分已被填充)不一定是可解的。 只需要根据以上规则,验证已经填入的数字是否有效即可。
示例 1:
输入:board = [[“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:
输入:board = [[“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 存在, 因此这个数独是无效的。
提示:
board.length == 9 board[i].length == 9 board[i][j] 是一位数字或者 ‘.’
解法
左右遍历,上下遍历,以及判断小方块中是否有重复的
如何确定是哪一个小方块,通过横纵坐标能得到:
j // 3 + i // 3 * 3
参考:
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
row = [[0]*10 for _ in range(9)]
col = [[0]*10 for _ in range(9)]
box = [[0]*10 for _ in range(9)]
for i in range(9):
for j in range(9):
if board[i][j] == '.':
continue
curNum = int(board[i][j])
if row[i][curNum] != 0 or col[j][curNum] != 0 or box[j//3+ i//3 * 3][curNum] != 0:
return False
row[i][curNum] = 1
col[j][curNum] = 1
box[j//3 + i//3*3][curNum] = 1
return True
复杂度分析
- 时间复杂度:O(1),固定9x9大小的问题,计算量不随数据发生明显变化
- 空间复杂度:O(1), 固定9x9大小的问题, 空间里不随数据发生明显变化
|