Valid Sudoku
2 min readApr 22, 2019
Question: Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:
- Each row must contain the digits
1-9
without repetition. - Each column must contain the digits
1-9
without repetition. - Each of the 9
3x3
sub-boxes of the grid must contain the digits1-9
without repetition.
The Sudoku board could be partially filled, where empty cells are filled with the character '.'
.
Example 1:
Input:
[
["5","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]
]
Output: true
Example 2:
Input:
[
["8","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]
]
Output: false
Explanation: Same as Example 1, except with the 5 in the top left corner being
modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid.
You may view the full question here.
Approach 1: Let’s try the simple approach of checking all the possibilities —
//Approach 1:
//Runtime: 3ms
//Memory usage: 45.3MBclass Solution {
public boolean isValidSudoku(char[][] board) {
return allRows(board) && allColumns(board) && subSets(board);
}
private boolean subSets(char[][] board){
int[] iS = new int[]{0,3,6};
int[] iE = new int[]{2,5,8};
for(int i = 0; i<=2; i++){
for(int j = 0; j<=2; j++){
if(!check(board, iS[i], iE[i], iS[j], iE[j])){
return false;
}
}
}
return true;
}
private boolean allRows(char[][] board){
int max = board.length - 1;
for(int r = 0; r<=max; r++){
if(!check(board, r, r, 0, max)){
return false;
}
}
return true;
}
private boolean allColumns(char[][] board){
int max = board.length - 1;
for(int c = 0; c<=max; c++){
if(!check(board, 0, max, c, c)){
return false;
}
}
return true;
}
private boolean check(char[][] board, int rS, int rE, int cS, int cE){
HashMap<Character, Integer> map = new HashMap();
for(int r = rS; r<=rE; r++){
for(int c =cS; c<=cE; c++){
if(board[r][c]!='.'){
if(map.containsKey(board[r][c])){
return false;
}
map.put(board[r][c], 1);
}
}
}
return true;
}
}
Find more posts here.
Cheers & Chao!