题目描述:请你判断一个
9 x 9
的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。- 数字
1-9
在每一列只能出现一次。- 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。(请参考示例图)注意:
- 一个有效的数独(部分已被填充)不一定是可解的。
- 只需要根据以上规则,验证已经填入的数字是否有效即可。
- 空白格用
'.'
表示。示例 1:
输入: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"]] 输出:true示例 2:
输入: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"]] 输出:false 解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。提示:
board.length == 9
board[i].length == 9
board[i][j]
是一位数字(1-9
)或者'.'
-
验证每一行和每一列:
- 首先,通过两个嵌套的循环遍历数独的每一行和每一列。
- 在遍历每一行和每一列时,使用
digit
数组来记录数字的出现情况,数组的索引对应数字的值,值为true
表示该数字已经出现过。 - 如果遍历过程中发现某个数字已经在
digit
数组中出现过(即digit[temp - '0']
为true
),则说明这个数独是无效的,因为同一行或同一列中出现了重复的数字。
-
验证每个小九宫格:
- 使用第三个循环来遍历每个小九宫格,一共有 9 个小九宫格。
- 在遍历每个小九宫格时,同样使用
digit
数组来记录数字的出现情况。 - 通过两个嵌套的循环遍历每个小九宫格中的每个格子,计算出当前格子所在的行和列,然后根据行和列计算出当前格子在数独中的位置。
- 如果遍历过程中发现某个数字已经在
digit
数组中出现过,则说明这个数独是无效的,因为同一个小九宫格中出现了重复的数字。
class Solution {
public boolean isValidSudoku(char[][] board) {
boolean[] digit = new boolean[10];
for (int i = 0; i < 9; i++) {
Arrays.fill(digit, false);
for (int j = 0; j < 9; j++) {
int temp = board[i][j];
if(temp=='.')continue;
if (digit[temp - '0']) return false;
else digit[temp - '0'] = true;
}
}
for (int j = 0; j < 9; j++) {
Arrays.fill(digit,false);
for (int i = 0; i < 9; i++) {
int temp = board[i][j];
if (temp == '.') continue;
if (digit[temp - '0']) return false;
else digit[temp - '0'] = true;
}
}
for (int k = 0; k < 9; k++) {
Arrays.fill(digit, false);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
int row = (k / 3) * 3 + i;
int col = (k % 3) * 3 + j;
int temp = board[row][col];
if(temp=='.')continue;
if (digit[temp - '0']) return false;
else digit[temp - '0'] = true;
}
}
}
return true;
}
}