此题有个关键点,是char转int,char 0 转int 是48,要进行修改!!!
自始至终一个一个遍历一遍
当他出现时候,把当前行/列/3*3小方块,都给他加1
按数独的规则来:
-
同一个数字在每一行只能出现一次;
-
同一个数字在每一列只能出现一次;
-
同一个数字在每一个3*3格只能出现一次
加1之后,再进行判断这个行/列/3*3小方块是否是第二次出现,如果出现则为错误数独
class Solution {
public boolean isValidSudoku(char[][] board) {
//所有
int[][] rows = new int[9][9];
int[][] columns = new int[9][9];
int[][][] subboxes = new int[3][3][9];
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(board[i][j] != '.'){
//char 转 int 是按ASCII来算的,char 0值是048,a是097
int sample = (int)board[i][j] - 48 -1;
//这一排、一列、3*3网格都没有这个数了,记录
//第i行,数字board[i][j],+1
rows[i][sample]++;
//第j列,数字board[i][j],+1
columns[j][sample]++;
//第i行第j列3*3网格,数字board[i][j],+1
//之所以除3,是因为3*3的小网格,横纵坐标是3,下标除3刚好等于第几个网格
subboxes[i/3][j/3][sample]++;
//然后判断里面的,行/列/3*3网格,当前这个数是否超过了1,超过了1表示出现了2次
if(rows[i][sample]>1 || columns[j][sample]>1 || subboxes[i/3][j/3][sample]>1){
return false;
}
}
}
}
return true;
}
}
时间复杂度:O(1)。数独共有 81 个单元格,只需要对每个单元格遍历一次即可。
空间复杂度:O(1)。由于数独的大小固定,数组空间大小固定。
此题有个关键点,是char转int,char 0 转int 是48,要进行修改!!!