模拟
题目只要求判断当前数独是否合法,不要求真的解出数独。因此只需要按规则检查每个已经填入的数字是否重复出现即可。
数独的合法性有三条约束:同一行不能重复,同一列不能重复,同一个 $3 \times 3$ 宫内也不能重复。遍历棋盘时,遇到数字就分别检查它在对应的行、列、宫中是否已经出现过,如果出现过则直接返回 false;否则标记为已出现。
其中第几个宫可以通过公式 $k = (i / 3) \times 3 + j / 3$ 计算得到。
时间复杂度 $O(1)$
空间复杂度 $O(1)$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public boolean isValidSudoku(char[][] board) { int[][][] map = new int[3][10][10]; for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { if (board[i][j] == '.') { continue; } int num = board[i][j] - '0'; int k = (i / 3) * 3 + j / 3; if (map[0][i][num] > 0 || map[1][j][num] > 0 || map[2][k][num] > 0) { return false; } map[0][i][num]++; map[1][j][num]++; map[2][k][num]++; } } return true; } }
|