Valid Sudoku

Monisha Mathew
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:

  1. Each row must contain the digits 1-9 without repetition.
  2. Each column must contain the digits 1-9 without repetition.
  3. Each of the 9 3x3 sub-boxes of the grid must contain the digits 1-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.3MB
class 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!

--

--