这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战
leetcode 有效的数独
请你判断一个 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
解题:要判断9 x 9 的数独是否有效,可以遍历每一个数字来判断了,同时有效的数独还得满足几个条件:1.数字1-9中在每一列不能出现相同的数字,2.数字1-9中在每一行不能出现相同的数字,3.在9 x 9分割成的每一个3 x 3的区域内也不能出现数字1-9中相同的数字。所以就是通过这些条件来校验是否满足有效数独。
所以在遍历的过程中可以使用哈希表来记录一下,每一行、每一列、每一个九宫格中数字出现的次数,哈希表的元素下标数字就代表这个数字出现的次数,因为这个下标是从0开始的所以,下标要+1或者数字-1来判断,或者也可以不用0下标的位置,元素值就代表这个数字下标+1出现的次数了,但凡有一个数字重复那就over。遍历获取字符数字,如果不是数字的话就不用管了,否则就把这个数字对应出现的次数+1,一边遍历的的同时一边判断,如果有数字在这些区域内重复出现了就直接返回false; 具体的,用两个9 x 9 的数组存储每一行、每一列的数字,一个3 x 3 x 9的数组存储每一个九宫格的数字,遍历9 x 9的数独的数字,然后给每一个哈希表的下标下的数字次数+1,最后判断一下这个数字是不是重复出现了,重复了就直接结束,否则继续判断知道完毕就代表没问题了。
class Solution {
public boolean isValidSudoku(char[][] board) {
// 行、列、格的哈希表
int[][] row = new int[9][9];
int[][] column = new int[9][9];
int[][][] cell = new int[3][3][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;
row[i][num]++;
column[j][num]++;
cell[i / 3][j / 3][num]++;
if (row[i][num] > 1 || column[j][num] > 1 || cell[i / 3][j / 3][num] > 1) {
return false;
}
}
}
return true;
}
}