遊戲模擬題: 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
91會員
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
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
分享一個猜數字的遊戲題目,給予提示讓玩家找出正確的四位數密碼。
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
112年國中教育會考數學科詳解 手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
本選擇題組共有十題,每題只有一個正確答案。
Thumbnail
探討正義想關主題的桌上解謎遊戲, 好玩卻也能引人省思
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
分享一個猜數字的遊戲題目,給予提示讓玩家找出正確的四位數密碼。
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
112年國中教育會考數學科詳解 手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
手寫版,有寫錯或看不懂的地方,都可以在底下留言給我。 感謝!
Thumbnail
本選擇題組共有十題,每題只有一個正確答案。
Thumbnail
探討正義想關主題的桌上解謎遊戲, 好玩卻也能引人省思