Description
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 digits 1-9 without repetition.
The Sudoku board could be partially filled, where empty cells are filled with the character ‘.’
Examples
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.
Note
- A Sudoku board (partially filled) could be valid but is not necessarily solvable.
- Only the filled cells need to be validated according to the mentioned rules.
- The given board contain only digits 1-9 and the character ‘.’.
- The given board size is always 9x9.
解题思路
这题一开始觉得不像medium的题,因为想着要先解开这个数独然后判断能否存在解
但题目只是要你判断现在这个残缺的数独是否合法即可
那事情就变得简单了起来
横着判断一次、纵着判断一次、九宫格分别判断一次就好了
class Solution {
public boolean isValidSudoku(char[][] board) {
int i, j, p, q;
for(i = 0; i < 9; i++){
Set<Character> num = new HashSet<>();
for(j = 0; j < 9; j++){
if(board[i][j] == '.')
continue;
if(num.contains(board[i][j]))
return false;
num.add(board[i][j]);
}
}
for(j = 0; j < 9; j++){
Set<Character> num = new HashSet<>();
for(i = 0; i < 9; i++){
if(board[i][j] == '.')
continue;
if(num.contains(board[i][j]))
return false;
num.add(board[i][j]);
}
}
p = 0; q = 0;
for(p = 0; p < 3; p++){
for(q = 0; q < 3; q++){
Set<Character> num = new HashSet<>();
for(i = p * 3; i < p * 3 + 3; i++){
for(j = q * 3; j < q * 3 + 3; j++){
if(board[i][j] == '.')
continue;
if(num.contains(board[i][j]))
return false;
num.add(board[i][j]);
}
}
}
}
return true;
}
}
其实也还好,87%,去摸了下100%的……啊人家的判断方式是位运算
class Solution {
public boolean isValidSudoku(char[][] board) {
/*declare three variables, one for row,col and cube inside*/
short[] rows = new short[9];
short[] cols = new short[9];
short[] cube = new short[9];
/*iterate through rows and cols one by one*/
for(int row=0;row<board.length;row++){
for(int col=0;col<board[0].length;col++){
/*if you encounter blank character/empty cell that means its valid just continue*/
if(board[row][col]=='.') continue;
short value = (short) (1<<board[row][col]-'1');
if((value & rows[row])>0) return false;
if((value & cols[col])>0) return false;
if((value & cube[3*(row/3)+(col/3)])>0) return false;
rows[row]|=value;
cols[col]|=value;
cube[3*(row/3)+(col/3)]|=value;
}
}
return true;
}
}
是还需要研究的算法!