LeetCode isValidSudoku Python3

題目描述:判斷一個 9x9 的數獨是否有效。驗證已經填入的數字即可,判斷規則如下:

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

來源:力扣(LeetCode)https://leetcode-cn.com/problems/valid-sudoku
https://leetcode-cn.com/problems/valid-sudoku/

數獨部分空格內填入了數字,空白格用 “.” 來表示。

示例 :
輸入 : [ [“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

思路就是按照規則進行三次查找驗證,但是比較巧妙的是,這三次查找可以在一個循環裏完成。另外對於使用哈希也就是字典用來計數的方法,這道題也有一個很好的示範作用。

  • 第一點,想要在一個循環內完成三項查找,就要對 9 個 3x3 的子塊編號,編號規則爲:index = (i // 3) * 3 + j // 3
  • 第二點,使用字典計數每個數字出現的次數,這裏用到的字典方法 get 是這樣的:dict.get (key, default=None),key 爲要查找的鍵,而 default 爲若 key 不在字典中時返回的值,這個默認值在這裏被設爲 0,所以當出現字典中不存在的鍵時,就在字典中添加該鍵且 value 爲 1
def isValidSudoku(board):
        row = [{} for _ in range(9)]
        col = [{} for _ in range(9)]
        block = [{} for _ in range(9)]
        
        for i in range(9):
            for j in range(9):
                num = board[i][j]
                b_index = (i//3)*3 + j // 3
                
                if num != '.':
                    row[i][num] = row[i].get(num, 0) + 1
                    col[j][num] = col[j].get(num, 0) + 1
                    block[b_index][num] = block[b_index].get(num, 0) + 1
                    if row[i][num]>1 or col[j][num]>1 or block[b_index][num]>1:
                        return False
        return True
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章