【leetcode】36. 有效的數獨

利用二重循環的下標來表示行、列和小正方形,減少不必要的數據存儲,每一次內循環都代表着對一行或是一列或是一個小正方形的遍歷。外循環則代表對下一行,下一列和下一個小正方形的遍歷。

判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。

  1. 數字 1-9 在每一行只能出現一次。
  2. 數字 1-9 在每一列只能出現一次。
  3. 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。

上圖是一個部分填充的有效的數獨。

數獨部分空格內已填入了數字,空白格用 '.' 表示。

輸入:
[
  ["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

代碼:注意字典的鍵值對

class Solution:
    def isValidSudoku(self, board):
        """
        :type board: List[List[str]]
        :rtype: bool
        """
        row = [{},{},{},{},{},{},{},{},{}] # 值:1
        col = [{},{},{},{},{},{},{},{},{}]
        cell = [{},{},{},{},{},{},{},{},{}]
        n = len(board)
        for i in range(n):
            for j in range(n):
                block = 3*(i//3)+j//3 # 找單元
                num = board[i][j]
                if num != '.':
                    if num not in row[i] and num not in col[j] and num not in cell[block]:
                        row[i][num] = 1
                        col[j][num] = 1
                        cell[block][num] = 1
                    else:
                        return False
        # print(row)
        # [{'5': 1, '3': 1, '7': 1}, {'6': 1, '1': 1, '9': 1, '5': 1}, 
        # {'9': 1, '8': 1, '6': 1}, {'8': 1, '6': 1, '3': 1}, 
        # {'4': 1, '8': 1, '3': 1, '1': 1}, {'7': 1, '2': 1, '6': 1}, 
        # {'6': 1, '2': 1, '8': 1}, {'4': 1, '1': 1, '9': 1, '5': 1}, 
        # {'8': 1, '7': 1, '9': 1}]
        return True

參考:

leetcode 36 Vaild Soduku(有效的數獨) python3 最簡代碼(單次循環)

leetcode 36. 有效的數獨 (python)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章