自解1:
java
class Solution {
public boolean isValidSudoku(char[][] board) {
// 用来记录横向的数字
int[] xAxis = new int[10];
// 用来记录纵向的数字
int[] yAxis = new int[10];
// 用来记录每个3x3的小格子内的数字数
int[][][] xyAxis = new int[3][3][10];
for(int i = 0;i<9;i++){
xAxis = new int[10];
yAxis = new int[10];
for(int j = 0;j<9;j++){
// 计算位于哪个小格子: 0 1 2
int x1 = i/3;
int y1 = j/3;
char c1 = board[i][j];
char c2 = board[j][i];
if(c1 != '.'){
int num = c1 - '0';
yAxis[num]++;
xyAxis[x1][y1][num]++;
}
if(c2 != '.'){
int num = c2 - '0';
xAxis[num]++;
}
}
for(int j=1;j<=9;j++){
if(yAxis[j]>1) return false;
if(xAxis[j]>1) return false;
}
}
for(int i = 0;i<3;i++){
for(int j = 0 ;j<3;j++){
for(int z=1;z<=9;z++){
if(xyAxis[i][j][z] > 1) return false;
}
}
}
return true;
}
}
官解2:一次循环
java
class Solution {
public boolean isValidSudoku(char[][] board) {
int[][] xAxis = new int[9][9];
int[][] yAxis = new int[9][9];
int[][][] xyAxis = 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 != '.'){
int idx = c - '0' - 1;
xAxis[i][idx] ++;
yAxis[j][idx] ++;
xyAxis[i/3][j/3][idx] ++;
if(xAxis[i][idx] > 1 ||
yAxis[j][idx] > 1 ||
xyAxis[i/3][j/3][idx] > 1){
return false;
}
}
}
}
return true;
}
}