题目链接
有效的数独
题目描述
注意点
- board.length == 9
- board[i].length == 9
- board[i][j] 是一位数字(1-9)或者 ‘.’
解答思路
- 首先判断行是否满足数独条件,再判断列是否满足数独条件,最后再判断划分的3x3方格是否满足数独条件,中间有一处不满足则直接返回false,遍历完后都满足条件则返回true
代码
class Solution {
public boolean isValidSudoku(char[][] board) {
int row = board.length;
int col = board[0].length;
// 判断行
for (int i = 0; i < row; i++) {
int[] arr = new int[10];
for (int j = 0; j < col; j++) {
if (board[i][j] == '.') {
continue;
}
if (arr[board[i][j] - '0'] != 0) {
return false;
}
arr[board[i][j] - '0'] = 1;
}
}
// 判断列
for (int j = 0; j < col; j++) {
int[] arr = new int[10];
for (int i = 0; i < row; i++) {
if (board[i][j] == '.') {
continue;
}
if (arr[board[i][j] - '0'] != 0) {
return false;
}
arr[board[i][j] - '0'] = 1;
}
}
// 判断3 x 3方格
for (int i = 0; i < row; i = i + 3) {
for (int j = 0; j < col; j = j + 3) {
if (!isValidSudokuSquare(board, i, j)) {
return false;
}
}
}
return true;
}
public boolean isValidSudokuSquare(char[][] board, int x, int y) {
int[] arr = new int[10];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[x + i][y + j] == '.') {
continue;
}
if (arr[board[x + i][y + j] - '0'] != 0) {
return false;
}
arr[board[x + i][y + j] - '0'] = 1;
}
}
return true;
}
}
关键点
- 有效数独的条件