题意
判断一个9*9的数独是否有效,必须满足以下3个条件:
1、数字1-9在每一行只能出现一次
2、数字1-9在每一列只能出现一次
3、数字1-9在每一个3*3宫格内只能出现一次
解法
- 暴力解法:
首先逐行判断,其次逐列判断,再其次逐个3*3宫格内判断:
class Solution {
//暴力解法
public static boolean isValidSudoku(char[][] board) {
int[] ints;
//判断行
for (int i = 0; i < 9; i++) {
ints = new int[10];
for (int j = 0; j < 9; j++) {
char c = board[i][j];
if (c == '.') {
continue;
}
if (ints[Integer.parseInt(String.valueOf(c))] >= 1) {
return false;
}
ints[Integer.parseInt(String.valueOf(c))]++;
}
}
//判断列
for (int i = 0; i < 9; i++) {
ints = new int[10];
for (int j = 0; j < 9; j++) {
char c = board[j][i];
if (c == '.') {
continue;
}
if (ints[Integer.parseInt(String.valueOf(c))] >= 1) {
return false;
}
ints[Integer.parseInt(String.valueOf(c))]++;
}
}
//判断3 * 3宫格
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
ints = new int[10];
for (int ii = i * 3; ii < i * 3 + 3; ii++) {
for (int jj = j * 3; jj < j * 3 + 3; jj++) {
char c = board[ii][jj];
if (c == '.') {
continue;
}
if (ints[Integer.parseInt(String.valueOf(c))] >= 1) {
return false;
}
ints[Integer.parseInt(String.valueOf(c))]++;
}
}
}
}
return true;
}
}
- 缓存解法:
使用二维数组,双层循环,逐个判断存储当前行、列、box的元素的个数,如果个数为1,返回false,否则个数分别+1;
class Solution {
//暴力解法
public static boolean isValidSudoku(char[][] board) {
//整个board有9行,第二维的维数10是为了让下标有9,和数独中的数字9对应。
//哈希表存储每一行的每个数是否出现过,默认初始情况下,每一行每一个数字没有出现过
int[][] row = new int[9][10];
//存储每一列的每个数是否出现过,默认初始情况下,每一列的每一个数都没有出现过
int[][] col = new int[9][10];
//存储每一个box的每一个数是否出现过,默认初始情况下,在每个box中,每个数都没有出现过,整个board数组有9个box
int[][] box = new int[9][10];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
//遍历到第i行第j列的数字,要判断在所在的行有没有出现过
//同时判断在所在的列有没有出现过
//同时判断在所在的box中有没有出现过
if (board[i][j] == '.')
continue;
int curNumber = board[i][j] - '0';
if (row[i][curNumber] == 1)
return false;
if (col[j][curNumber] == 1)
return false;
if (box[j / 3 + (i / 3) * 3][curNumber] == 1)
return false;
// 之前都没出现过,现在出现了,就给它置为1,下次再遇见就能够直接返回false了
row[i][curNumber] = 1;
col[j][curNumber] = 1;
box[j / 3 + (i / 3) * 3][curNumber] = 1;
}
}
return true;
}
}