runtime 15 ms, beats 98.64% of cpp submissions
O(n^2) solution with explanation
tags: none
🔗 link
Valid Sudoku
📖 description
給定一個 9 x 9 的 array 表示一個數獨題目,判斷這個版面是否是一個合法的數獨。
🧠 solution
只需要根據數獨的定義模擬即可,即同一行或列不能出現重複的數字,且畫分的九個區間也不能出現重複的數字。
我們可以利用暴力法去檢查所有狀態,但其實可以藉由把看過的物件儲存起來,來減少搜尋次數到只需要遍歷一次數獨版面。
⏳ time complexity
遍歷一次數獨版面,時間複雜度 O(n^2)
總時間複雜度 O(n^2)
📝 code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution { public: bool isValidSudoku(vector<vector<char>>& board) { vector<vector<bool>> rows(9,vector<bool>(10,false)),cols(9,vector<bool>(10,false)),blocks(9,vector<bool>(10,false));
int curr,blockId; for(int i=0;i<9;i++){ for(int j=0;j<9;j++){ if(board[i][j] == '.'){ continue; } blockId = (i/3)*3 + j/3; curr = board[i][j]-'0';
if(rows[i][curr] || cols[j][curr] || blocks[blockId][curr]){ return false; }
rows[i][curr] = true; cols[j][curr] = true; blocks[blockId][curr] = true; } } return true; } };
|