leetcode36.有效数独——leetcode每日一题2021.9.17

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
上一篇:力扣每日一题2021-09-17有效的数独


下一篇:[leetcode 36][有效的数独]