36.有效的数独
题目描述
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
1.数字 1-9 在每一行只能出现一次。
2.数字 1-9 在每一列只能出现一次。
3.数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用 '.' 表示。
示例 1:
输入: [ ["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"] ] 输出: true
思路
1.本题可以通过三个哈希表来记录每个元素出现的次数,若该元素在同一行、列或者33矩阵中出现多次,则不是有效数独。
2.33矩阵我们可以根据行列计算,弄出0-8个编号的矩阵即可。
类似于下图:

Java代码实现
public boolean isValidSudoku(char[][] board) {
Map<Character,Integer>[] rows = new HashMap[9];
Map<Character,Integer>[] cols = new HashMap[9];
Map<Character,Integer>[] boxes = new HashMap[9];
//初始化
for (int i = 0; i < 9; i++) {
rows[i] = new HashMap<>();
cols[i] = new HashMap<>();
boxes[i] = new HashMap<>();
}
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if(board[i][j] == '.')
continue;
//判断 行 是否符合要求
if (rows[i].containsKey(board[i][j]))
return false;
else
rows[i].put(board[i][j],i);
//判断 列 是否符合要求
if(cols[j].containsKey(board[i][j]))
return false;
else
cols[j].put(board[i][j],j);
//判断 矩阵 是否符合要求
int boxIndex = i/3 + j/3*3;
if(boxes[boxIndex].containsKey(board[i][j]))
return false;
else
boxes[boxIndex].put(board[i][j],boxIndex);
}
}
return true;
}Golang代码实现
func isValidSudoku(board [][]byte) bool {
colMap := make([]map[byte]int,9)
rowMap := make([]map[byte]int,9)
boxMap := make([]map[byte]int,9)
for i:=0 ;i < 9 ;i++{
colMap[i] = make(map[byte]int,9)
rowMap[i] = make(map[byte]int,9)
boxMap[i] = make(map[byte]int,9)
}
for i := 0; i < 9; i++ {
for j := 0; j < 9; j++ {
if board[i][j] == '.'{
continue
}
if val := rowMap[i][board[i][j]]; val == 1{
return false
}
rowMap[i][board[i][j]] = 1
if val := colMap[j][board[i][j]]; val == 1{
return false
}
colMap[j][board[i][j]] = 1
boxIndex := i/3 + j/3*3
if val := boxMap[boxIndex][board[i][j]]; val == 1{
return false
}
boxMap[boxIndex][board[i][j]] = 1
}
}
return true
}

查看3道真题和解析