题目描述
判断一个 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 }