有效的數獨 | Medium | LeetCode#36. Valid Sudoku
題目敘述


- 題目難度:
Medium - 題目描述: 給定一個
9 x 9大小的數獨board請確認該數獨是否是有效的。
只有當被填入數字滿足下面條件,數獨才會是有效的:
(1) 每一列只包含非重複的數字 1-9
(2) 每一行只包含非重複的數字 1-9
(3) 共9個 3 x 3 的子方格, 每個子方格中的數字 1-9 都不重複
解法
一開始的想法
想法就偏向暴力解,首先就是要迭代 board 中每一列,看數字是否重複,這時可以用一個 unordered_set 去儲存數字,並在每一格檢查數字是否重複,如果重複就回傳 false,接著迭代每一行檢查是否重複。每次換行換列 unordered_set 都要清空為的是保存新的一行/列的數字。 最後就是需要迭代 9 個 3*3 大小的子方格,如果重複就回傳 false 函數最後代表檢查完畢,回傳 true。
我的解法
1 | class Solution { |
實際操作上也跟想像上的一樣,分成三部分:檢查行、檢查列、檢查方格。其中也有宣告一個 unordered_set uset 來去為每一行/列保存數字。每一行/列結束後也會清空 uset.clear()。 只有最後在迭代子方格的時候需要注意,最外層兩格迴圈代表依序選擇不同的子方格去迭代,內部兩層迴圈則是迭代子方格內部,一但發現重複數字,就回傳 false,另外在每次迭代完子方格後,uset 要清空。
執行結果

複雜度
時間複雜度
$O(1)$:棋盤一共 9 x 9 格,每一格進行檢查或插入的行為為 $O(1)$ 因此一共會是 $O(81)$ 為常數時間複雜度,因此整體會是 $O(1)$
空間複雜度
$O(1)$: 每次進行檢查完畢後 unordered_set 都會清空,因此整體會是 $O(1)$
但如果今天不是固定棋盤,而是 $n \times n$ 則時間複雜度會上升為 $O(n^2)$
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 Kevin Liu's 部落格 || Technical || Travel!
評論










