題目網址:https://leetcode.cn/problems/valid-sudoku/
題意:判斷 9 x 9
數獨是否有效, 根據以下規則, 判斷已填入的數字是否有效即可。
- 數字
1 - 9
在每一行只能出現一次
- 數字
1 - 9
在每一列只能出現一次
- 數字
1 - 9
在每一個 3 x 3
九宮格中只能出現一次
空白格以 '.'
表示。


Solution:
想法:一旦 board[r][c]
不為 '.'
, 就去判斷該 row、col、block 是否有重複的 char
class Solution { public: bool isValidSudoku(vector<vector<char>>& board) { for (int r = 0; r < 9; ++r) { for (int c = 0; c < 9; ++c) { const char target = board[r][c]; if (target == '.') { continue; }
if (!isValidRow(board, r, target) || !isValidCol(board, c, target) || !isValidBlock(board, r, c, target)) { return false; } } } return true; }
private: bool isValidRow(const vector<vector<char>>& board, const int& row, const char& target) { bool seen[9] = {false}; for (int col = 0; col < 9; col++) { if (board[row][col] == '.') { continue; } if (seen[board[row][col] - '1']) { return false; } seen[board[row][col] - '1'] = true; } return true; }
bool isValidCol(const vector<vector<char>>& board, const int& col, const char& target) { bool seen[9] = {false}; for (int row = 0; row < 9; row++) { if (board[row][col] == '.') { continue; } if (seen[board[row][col] - '1']) { return false; } seen[board[row][col] - '1'] = true; } return true; }
bool isValidBlock(const vector<vector<char>>& board, const int& row, const int& col, const char& target) { int blockR = (row / 3) * 3; int blockC = (col / 3) * 3; bool seen[9] = {false}; for (int r = blockR; r < blockR + 3; r++) { for (int c = blockC; c < blockC + 3; c++) { if (board[r][c] == '.') { continue; } if (seen[board[r][c] - '1']) { return false; } seen[board[r][c] - '1'] = true; } } return true; } };
|
- time:$O(1)$ ➔ 每個
board[r][c]
判斷該 row、col、block 是否重複皆需 $O(9)$, 故總共需 $O((9 * 9) \cdot (3 * 9))$
- space:$O(1)$ ➔ 只需常數空間