36. 有效的数独
题目:
请你判断一个 9 x 9
的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。(请参考示例图)
注意:
- 一个有效的数独(部分已被填充)不一定是可解的。
- 只需要根据以上规则,验证已经填入的数字是否有效即可。
- 空白格用
'.'
表示。
思路:
可以用下标数组来判断有没有重复数字,只有1-9的话就创立数组,比如有9,那就a[9] +=1, 如果有数字大于1,则证明有重复
要判断的总共有9*3的数组:横排,竖排,9个小矩阵,做个map然后建立对应的数组即可; 按照上面的方法判断重复
代码:
public boolean isValidSudoku(char[][] board) {Map<String, int[]> map = new HashMap<>();for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {if (board[i][j] != '.') {String str = (i / 3) + "," + (j / 3);int[] flags = map.getOrDefault(str, new int[10]);int v1 = Integer.valueOf(String.valueOf(board[i][j]));flags[v1] += 1;map.put(str, flags);if (flags[v1] > 1) {return false;}int[] flagsCol = map.getOrDefault("R" + i, new int[10]);flagsCol[v1] += 1;if (flagsCol[v1] > 1) {return false;}map.put("R" + i, flagsCol);int[] flagsRow = map.getOrDefault("C" + j, new int[10]);flagsRow[v1] += 1;if (flagsRow[v1] > 1) {return false;}map.put("C" + j, flagsRow);}}}return true;}