原题链接
方法1:无脑遍历每个格子,若该格子是数字,检查该数字是否可行,只要有一个不可行的,返回false。
手段比较简单暴力,所以效率比较低
public class Solution {
//leftUpArr[i] 表示 i 号 3*3网格的左上角格子的行与列
String[] leftUpArr = new String[] {"00", "03", "06", "30", "33", "36", "60", "63", "66"};
public boolean isValidSudoku(char[][] board) {
if(board == null || board.length == 0) return false;
for(int i = 0;i < board.length;i++) {
for(int j = 0;j < board[0].length;j++) {
if(board[i][j] != '.') {
if(!isValid(board, i, j)) return false;
}
}
}
return true;
}
private boolean isValid(char[][] board, int row, int col) {
for(int i = 0;i < 9;i++) {
if(i == row) continue;
//检查col列
if(board[i][col] == board[row][col]) return false;
}
for(int j = 0;j < 9;j++) {
if(j == col) continue;
//检查row行
if(board[row][j] == board[row][col]) return false;
}
int gridNum = (row / 3) * 3 + col / 3;//获取(row,col)所在的3*3九宫格的编号
//如果该九宫格中,不能在放 board[row][col]这个值
if(!checkGrid(board, gridNum, row, col, board[row][col])) return false;
return true;
}
private boolean checkGrid(char[][] board, int gridNum,int row,int col, char c) {
String leftUp = leftUpArr[gridNum];//该3*3九宫格的左上角
int leftUpRow = Integer.valueOf(leftUp.charAt(0)+"");//左上角的行
int leftUpCol = Integer.valueOf(leftUp.charAt(1)+"");//列
for(int i = leftUpRow;i < leftUpRow + 3;i++) {//遍历这个3*3的九宫格
for(int j = leftUpCol;j < leftUpCol + 3;j++) {
if(i == row && j == col) {//如果遍历到(row, col)这个位置就跳过
continue;
}else if(board[i][j] != '.' && board[i][j] == c) return false;
}
}
return true;
}
}
方法2: 数组
摘自题解区,对比大佬的代码,感觉自己的好 low … =.=!
class Solution {
public boolean isValidSudoku(char[][] board) {
// 记录某行,某位数字是否已经被摆放
boolean[][] row = new boolean[9][9];
// 记录某列,某位数字是否已经被摆放
boolean[][] col = new boolean[9][9];
// 记录某 3x3 宫格内,某位数字是否已经被摆放
boolean[][] block = new boolean[9][9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] != '.') {
int num = board[i][j] - '1';//数字从1开始,所以需要-1,转化为该数字对应的索引
int blockIndex = i / 3 * 3 + j / 3;
if (row[i][num] || col[j][num] || block[blockIndex][num]) {
return false;
} else {
row[i][num] = true;
col[j][num] = true;
block[blockIndex][num] = true;
}
}
}
}
return true;
}
}