天天看點

<LeetCode天梯>Day013 有效的數獨(直接判斷法) | 初級算法 | Python

以下為我的天梯積分規則:

每日至少一題:一題積分+10分

若多做了一題(或多一種方法解答),則當日積分+20分(+10+10)

若做了三道以上,則從第三題開始算+20分(如:做了三道題則積分-10+10+20=40;做了四道題則積分–10+10+20+20=60)

初始分為100分

若差一天沒做題,則扣積分-10分(周六、周日除外注:休息)

堅持!!!

初級算法

刷題目錄

數組

<LeetCode天梯>Day013 有效的數獨(直接判斷法) | 初級算法 | Python
<LeetCode天梯>Day013 有效的數獨(直接判斷法) | 初級算法 | Python

題幹

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

數字 1-9 在每一行隻能出現一次

數字 1-9 在每一列隻能出現一次。

數字 1-9 在每一個以粗實線分隔的 3x3 宮内隻能出現一次。(請參考示例圖)

數獨部分空格内已填入了數字,空白格用 ‘.’ 表示。

注意:

一個有效的數獨(部分已被填充)不一定是可解的。

隻需要根據以上規則,驗證已經填入的數字是否有效即可。

示例1:

<LeetCode天梯>Day013 有效的數獨(直接判斷法) | 初級算法 | Python
<LeetCode天梯>Day013 有效的數獨(直接判斷法) | 初級算法 | Python
示例2:
<LeetCode天梯>Day013 有效的數獨(直接判斷法) | 初級算法 | Python

直接判斷法

分析:

我們需要查找再某行或某列及其3*3的宮内有無相同的數字,如果滿足條件,則傳回true;相反,則傳回false.

本題難度中等

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
    res = True  # 預設輸出True
            # 判斷行
            for i in range(len(board)):
                dotCount = board[i].count('.')  # 得到每一行中“.”的個數
                rightCount = len(board[i]) - dotCount + 1  # 得到每一行中真實數字的數
                judgeCount = len(set(board[i]))      # 得到集合每一行的元素個數,由于set()會直接将多餘的或者說相同的數,記為一個數,如:6,6,4,6,3. 輸出得到的長度為3,而不是5,意思三個6,隻保留一個6;且會從小到大,排序
                if rightCount != judgeCount:      # 判斷兩者的長度是否一直,若不一直則指派FALSE
                    res = False
            # 判斷列
            for i in range(len(board[0])):
                l = []    # 設定空數組存儲
                for j in range(len(board)):
                    l.append(board[j][i])       # 将每列元素存入臨時數組中
                dotCount = l.count('.')         # 計算“.”的個數
                rightCount = len(board[0]) - dotCount + 1       # 得到每一列中數字的個數
                judgeCount = len(set(l))        # 得到集合l的長度
                if rightCount != judgeCount:
                    res = False
            # 判斷3*3宮内是否重複
            for i in range(0, len(board), 3):
                for j in range(0, len(board[0]), 3):
                    m = []
                    for k in range(i, i+3):
                        for z in range(j, j+3):
                            m.append(board[k][z])
                    dotCount = m.count('.')
                    rightCount = len(m) - dotCount + 1
                    judgeCount = len(set(m))
                    if rightCount != judgeCount:
                        res = False
            return res      
<LeetCode天梯>Day013 有效的數獨(直接判斷法) | 初級算法 | Python
<LeetCode天梯>Day013 有效的數獨(直接判斷法) | 初級算法 | Python
<LeetCode天梯>Day013 有效的數獨(直接判斷法) | 初級算法 | Python