评论区看到的,只能说官方题解__都不看。
从左往右、从上往下的顺序遍历一次board,完成3个条件的检验
,这其中有个j/3 + (i/3)*3
最关键,用来判断是否每个数是否存在box中,j/3 + (i/3)*3
的解析如下:在3*9
的矩阵中,每个数属于哪个box就只取决于纵坐标,纵坐标为0/1/2的都属于box[0],纵坐标为3/4/5的都属于box[1],纵坐标为6/7/8的都属于box[2].也就是j/3
。而对于9x9
的矩阵,我们光根据j/3
得到0/1/2还是不够的,可能加上一个3的倍数,例如加0x3
,表示本行的box,加1x3
,表示在下一行的box,加2x3
,表示在下两行的box,这里的0/1/2怎么来的?和j/3
差不多同理,也就是i/3
class Solution {
public boolean isValidSudoku(char[][] board) {
// 存储每一行的每个数是否出现过,默认初始情况下,每个数都没出现过
int [][]row =new int[9][9];
int [][]col =new int[9][9];
int [][]box =new int[9][9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j]=='.'){
continue;
}
// -0为了转数字,-1是为了出现9*9数组,不然就把上面数组的[9][9]->[9][10]
int curNum = board[i][j]-'0' - 1;
// 判断是否在行、列、box中出现
if (row[i][curNum]==1){
return false;
}
if (col[j][curNum]==1){
return false;
}
if (box[j/3 + (i/3) * 3][curNum]==1){
return false;
}
// 之前都没出现过,现在出现了,下次再遇见直接false
row[i][curNum]=1;
col[j][curNum]=1;
box[j/3 + (i/3) * 3][curNum]=1;
}
}
return true;
}
}