- 小的九宫格和大的九宫格映射关系:index = j / 3 + (i / 3) * 3
- 数字n 出现了,就左移n位: 1 << n,进行保存
- 当下个数字 m 出现了,再左移 m 位,判断当前位置的数是否为1即可。
- 如果 & 运算不为0,则说明同为1,说明这个地方之前有过相同的数字出现。
- 否则说明当前的位置没有其他数出现过。
- 用3个数组来记录,表示行,列,小九宫格
class Solution {
public boolean isValidSudoku(char[][] board) {
int[] row = new int[9];
int[] col = new int[9];
int[] subBoard = new int[9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] == '.') {
continue;
}
int curVal = board[i][j] - '0';
int moveVal = 1 << curVal;
int subIndex = j / 3 + (i / 3) * 3;
if ((row[i] & moveVal) != 0) {
return false;
}
if ((col[j] & moveVal) != 0) {
return false;
}
if ((subBoard[subIndex] & moveVal) != 0) {
return false;
}
row[i] = row[i] | moveVal;
col[j] = col[j] | moveVal;
subBoard[subIndex] = subBoard[subIndex] | moveVal;
}
}
return true;
}
}