Welcome to Subscribe On Youtube
36. Valid Sudoku
Description
Determine if a 9 x 9
Sudoku board is valid. Only the filled cells need to be validated according to the following rules:
- Each row must contain the digits
1-9
without repetition. - Each column must contain the digits
1-9
without repetition. - Each of the nine
3 x 3
sub-boxes of the grid must contain the digits1-9
without repetition.
Note:
- A Sudoku board (partially filled) could be valid but is not necessarily solvable.
- Only the filled cells need to be validated according to the mentioned rules.
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
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: Same as Example 1, except with the 5 in the top left corner being modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid.
Constraints:
board.length == 9
board[i].length == 9
board[i][j]
is a digit1-9
or'.'
.
Solutions
Solution 1: Traversal once
The valid sudoku satisfies the following three conditions:
- The digits are not repeated in each row;
- The digits are not repeated in each column;
- The digits are not repeated in each $3 \times 3$ box.
Traverse the sudoku, for each digit, check whether the row, column and $3 \times 3$ box it is in have appeared the digit. If it is, return false
. If the traversal is over, return true
.
The time complexity is $O(C)$ and the space complexity is $O(C)$, where $C$ is the number of empty spaces in the sudoku. In this question, $C=81$.
-
class Solution { public boolean isValidSudoku(char[][] board) { boolean[][] row = new boolean[9][9]; boolean[][] col = new boolean[9][9]; boolean[][] sub = new boolean[9][9]; for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { char c = board[i][j]; if (c == '.') { continue; } int num = c - '0' - 1; int k = i / 3 * 3 + j / 3; if (row[i][num] || col[j][num] || sub[k][num]) { return false; } row[i][num] = true; col[j][num] = true; sub[k][num] = true; } } return true; } }
-
class Solution { public: bool isValidSudoku(vector<vector<char>>& board) { vector<vector<bool>> row(9, vector<bool>(9, false)); vector<vector<bool>> col(9, vector<bool>(9, false)); vector<vector<bool>> sub(9, vector<bool>(9, false)); for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { char c = board[i][j]; if (c == '.') continue; int num = c - '0' - 1; int k = i / 3 * 3 + j / 3; if (row[i][num] || col[j][num] || sub[k][num]) { return false; } row[i][num] = true; col[j][num] = true; sub[k][num] = true; } } return true; } };
-
class Solution: def isValidSudoku(self, board: List[List[str]]) -> bool: row = [[False] * 9 for _ in range(9)] col = [[False] * 9 for _ in range(9)] sub = [[False] * 9 for _ in range(9)] for i in range(9): for j in range(9): c = board[i][j] if c == '.': continue num = int(c) - 1 k = i // 3 * 3 + j // 3 if row[i][num] or col[j][num] or sub[k][num]: return False row[i][num] = True col[j][num] = True sub[k][num] = True return True
-
func isValidSudoku(board [][]byte) bool { row, col, sub := [9][9]bool{}, [9][9]bool{}, [9][9]bool{} for i := 0; i < 9; i++ { for j := 0; j < 9; j++ { num := board[i][j] - byte('1') if num < 0 || num > 9 { continue } k := i/3*3 + j/3 if row[i][num] || col[j][num] || sub[k][num] { return false } row[i][num] = true col[j][num] = true sub[k][num] = true } } return true }
-
function isValidSudoku(board: string[][]): boolean { const row: boolean[][] = Array.from({ length: 9 }, () => Array.from({ length: 9 }, () => false), ); const col: boolean[][] = Array.from({ length: 9 }, () => Array.from({ length: 9 }, () => false), ); const sub: boolean[][] = Array.from({ length: 9 }, () => Array.from({ length: 9 }, () => false), ); for (let i = 0; i < 9; ++i) { for (let j = 0; j < 9; ++j) { const num = board[i][j].charCodeAt(0) - '1'.charCodeAt(0); if (num < 0 || num > 8) { continue; } const k = Math.floor(i / 3) * 3 + Math.floor(j / 3); if (row[i][num] || col[j][num] || sub[k][num]) { return false; } row[i][num] = true; col[j][num] = true; sub[k][num] = true; } } return true; }
-
/** * @param {character[][]} board * @return {boolean} */ var isValidSudoku = function (board) { const row = [...Array(9)].map(() => Array(9).fill(false)); const col = [...Array(9)].map(() => Array(9).fill(false)); const sub = [...Array(9)].map(() => Array(9).fill(false)); for (let i = 0; i < 9; ++i) { for (let j = 0; j < 9; ++j) { const num = board[i][j].charCodeAt() - '1'.charCodeAt(); if (num < 0 || num > 8) { continue; } const k = Math.floor(i / 3) * 3 + Math.floor(j / 3); if (row[i][num] || col[j][num] || sub[k][num]) { return false; } row[i][num] = true; col[j][num] = true; sub[k][num] = true; } } return true; };
-
class Solution { /** * @param string[][] $board * @return boolean */ function isValidSudoku($board) { $rows = []; $columns = []; $boxes = []; for ($i = 0; $i < 9; $i++) { $rows[$i] = []; $columns[$i] = []; $boxes[$i] = []; } for ($row = 0; $row < 9; $row++) { for ($column = 0; $column < 9; $column++) { $cell = $board[$row][$column]; if ($cell != '.') { if (in_array($cell, $rows[$row]) || in_array($cell, $columns[$column]) || in_array($cell, $boxes[floor($row / 3) * 3 + floor($column / 3)])) { return false; } $rows[$row][] = $cell; $columns[$column][] = $cell; $boxes[floor($row / 3) * 3 + floor($column / 3)][] = $cell; } } } return true; } }