遊戲模擬題: Valid Sudoku 驗證是否為合法Sudoku輸入_Leetcode #36

閱讀時間約 9 分鐘

題目敘述 Valid Sudoku

給定一個9x9的輸入陣列代表數獨題目已經 部分作答 的狀態

請驗證已經作答的部分是否為合法的Sudoku的輸入


註:

合法的Sudoku輸入必須滿足這些規則

1~9每一直排恰好出現一次。

1~9每一橫排恰好出現一次。

1~9在3x3的小方陣裏面也恰好出現一次。


只要其中一個規則被打破,則是非法的Sudoku輸入,返回False

否則,返回True


測試範例

Example 1:

Input: 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"]]
Output: true

已作答的部分都滿足Sudoku的規則。​


Example 2:

Input: 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"]]
Output: false
Explanation:

左上角那個3x3的方陣裡
8重複出現兩次,違反Sudoku的規定​

約束條件

Constraints:

  • board.length == 9

輸入陣列的高一定是9

  • board[i].length == 9

輸入陣列的寬一定是9

  • board[i][j] is a digit 1-9 or '.'.

輸入陣列裡面只會有1~9或者 . (代表尚未作答的格子點)


演算法 檢查已作答部分是否符合Sudoku規則


針對整個9x9的輸入陣列進行檢查


已作答的部分必須滿足下列Sudoku規則:

1~9每一直排恰好出現一次。

1~9每一橫排恰好出現一次。

1~9在3x3的小方陣裏面也恰好出現一次。


只要其中一個規則被打破,則是非法的Sudoku輸入,返回False

否則,返回True


程式碼 檢查已作答部分是否符合Sudoku規則

class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:

# Row flag for 1~9
row_flag = [[False for i in range(9)] for j in range(9)]

# Column flag for 1~9
col_flag = [[False for i in range(9)] for j in range(9)]

# 3x3 sub-block flag for 1~9
block_flag = [[False for i in range(9)] for j in range(9)]

for i in range(9):
for j in range(9):

if board[i][j] != '.':

# get current number
num = int(board[i][j]) - 1

# compute index of 3x3 sub-block
k = (i//3)*3 + j//3

# Reject if there is number repeated in row, column or 3x3 sub-block
if row_flag[i][num] or col_flag[j][num] or block_flag[k][num]:
return False

# update row flag, column flag, 3x3 sub-block flag for current number
row_flag[i][num] = col_flag[j][num] = block_flag[k][num] = True

return True

複雜度分析

時間複雜度: O(9 * 9) = O(1)

針對整個9x9輸入矩陣做檢查,耗時O(81) = O(1)


空間複雜度: O(9 * 9) = O(1)

針對每一個橫排、直排、3x3小方陣 檢查1~9是否恰好存在一次的布林陣列,所需空間為O(81) = O(1)


Reference:

[1] Valid Sudoku - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目敘述 Minimum Deletions to Make String Balanced 給定一個只會有包含'a'b或'b'的輸入字串s。 每次操作可以任選一個字元刪除。 請問最少需要多少次操作,才會使得所有的'b'都在'a'後面? 測試範例 Example 1: Input: s
題目敘述: Reverse Bits 給定一個32bit的整數,請逆序翻轉其二進位表達式,輸出翻轉過後的數字。 例如輸入是二進位1010111 逆序翻轉後是 1110101,對應的十進位數值是117 測試範例 Example 1: Input: n = 00000010100101000
題目敘述 Count Number of Teams 給定一個輸入陣列rating,裡面代表每位成員的評分 挑選三位成員,對應到三個index i, j, k 且 i < j < k 如果rating[i] < rating[j] < rating[k] ,則此三人可以組成一隊。 或者ra
題目敘述: Minimum Cost to Convert String I 給定字元轉換映射表original, changes和對硬的成本陣列cost。 請問字串source轉換到字串destination的最小成本是多少? 如果無解,請返回-1 如果有解,請返回整體的轉換最小成本。
題目敘述 Sort the Jumbled Numbers 給定兩個輸入陣列 第一個是映射表,提供0~9 mapping到新數字的映射關係。 第二個陣列是原始數值。 請重新排序原始數值,排序依據是根據映射表對應之後的新數值的大小決定。 如果對應之後的新數值大小相同,則由原本的前後相對順序決定。
題目敘述 Sort Array by Increasing Frequency Leetcode #1636 給定一個輸入陣列,請依照出現頻率的多寡從低頻到高頻排列陣列元素。 如果有兩個元素的出現頻率相同,依照元素大小從大到小排列。 測試範例 Example 1: Input: nums
題目敘述 Minimum Deletions to Make String Balanced 給定一個只會有包含'a'b或'b'的輸入字串s。 每次操作可以任選一個字元刪除。 請問最少需要多少次操作,才會使得所有的'b'都在'a'後面? 測試範例 Example 1: Input: s
題目敘述: Reverse Bits 給定一個32bit的整數,請逆序翻轉其二進位表達式,輸出翻轉過後的數字。 例如輸入是二進位1010111 逆序翻轉後是 1110101,對應的十進位數值是117 測試範例 Example 1: Input: n = 00000010100101000
題目敘述 Count Number of Teams 給定一個輸入陣列rating,裡面代表每位成員的評分 挑選三位成員,對應到三個index i, j, k 且 i < j < k 如果rating[i] < rating[j] < rating[k] ,則此三人可以組成一隊。 或者ra
題目敘述: Minimum Cost to Convert String I 給定字元轉換映射表original, changes和對硬的成本陣列cost。 請問字串source轉換到字串destination的最小成本是多少? 如果無解,請返回-1 如果有解,請返回整體的轉換最小成本。
題目敘述 Sort the Jumbled Numbers 給定兩個輸入陣列 第一個是映射表,提供0~9 mapping到新數字的映射關係。 第二個陣列是原始數值。 請重新排序原始數值,排序依據是根據映射表對應之後的新數值的大小決定。 如果對應之後的新數值大小相同,則由原本的前後相對順序決定。
題目敘述 Sort Array by Increasing Frequency Leetcode #1636 給定一個輸入陣列,請依照出現頻率的多寡從低頻到高頻排列陣列元素。 如果有兩個元素的出現頻率相同,依照元素大小從大到小排列。 測試範例 Example 1: Input: nums
你可能也想看
Google News 追蹤
Thumbnail
分享一個猜數字的遊戲題目,給予提示讓玩家找出正確的四位數密碼。
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
112年國中教育會考數學科詳解 手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
本選擇題組共有十題,每題只有一個正確答案。
Thumbnail
探討正義想關主題的桌上解謎遊戲, 好玩卻也能引人省思
Thumbnail
分享一個猜數字的遊戲題目,給予提示讓玩家找出正確的四位數密碼。
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
112年國中教育會考數學科詳解 手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
本選擇題組共有十題,每題只有一個正確答案。
Thumbnail
探討正義想關主題的桌上解謎遊戲, 好玩卻也能引人省思