The Sudoku board could be partially filled, where empty cells are filled with the character
'.'.
A partially filled sudoku which is valid.
Note:A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.
Simple implementation problem. For each position on the board (x, y), we check:
- the row x
- the column y
- the square where (x, y) located in, it is determined by (x/3)*3 ~ (x/3+1)*3 and (y/3)*3 ~(y/3+1)*3
public boolean isValidSudoku(char[][] board) {
int m = board.length;
int n = board[0].length;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
if(!check(board, i, j))
return false;
}
}
return true;
}
private boolean check(char[][] board, int x, int y) {
int m = board.length;
int n = board[0].length;
if(board[x][y] == '.')
return true;
// check row
for(int i = 0; i < n; i++) {
if(i != y && board[x][i] == board[x][y])
return false;
}
// check column
for(int i = 0; i < m; i++) {
if(i != x && board[i][y] == board[x][y])
return false;
}
// check 3*3 square
for(int i = (x/3)*3; i < (x/3+1)*3; i++) {
for(int j = (y/3)*3; j < (y/3+1)*3; j++) {
if(i != x && j != y && board[i][j] == board[x][y])
return false;
}
}
return true;
}
Another method is to use a hashset or an array to hold the element we have meet in the row/column/square we are examining. This would reduce the time complexity to O(n^2) with space complexity to O(n).
public class Solution {
public boolean isValidSudoku(char[][] board) {
int m = board.length;
int n = board[0].length;
HashSet<Character> set = new HashSet<Character>();
// check row
for(int i = 0; i < m; i++) {
set.clear();
for(int j = 0; j < n; j++) {
if(board[i][j] != '.') {
if(set.contains(board[i][j]) == true)
return false;
else
set.add(board[i][j]);
}
}
}
// check column
for(int i = 0; i < n; i++) {
set.clear();
for(int j = 0; j < m; j++) {
if(board[j][i] != '.') {
if(set.contains(board[j][i]) == true)
return false;
else
set.add(board[j][i]);
}
}
}
// check square
for(int i = 0; i < m; i += 3) {
for(int j = 0; j < n; j += 3) {
set.clear();
for(int x = (i/3)*3; x < (i/3+1)*3; x++) {
for(int y = (j/3)*3; y < (j/3+1)*3; y++) {
if(board[x][y] != '.') {
if(set.contains(board[x][y]) == true)
return false;
else
set.add(board[x][y]);
}
}
}
}
}
return true;
}
}
没有评论:
发表评论