36. 有效的数独
请你判断一个 9 x 9
的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。(请参考示例图)
注意:
- 一个有效的数独(部分已被填充)不一定是可解的。
- 只需要根据以上规则,验证已经填入的数字是否有效即可。
- 空白格用
'.'
表示。
示例 1:
1 | 输入:board = |
示例 2:
1 | 输入:board = |
提示:
board.length == 9
board[i].length == 9
board[i][j]
是一位数字(1-9
)或者'.'
解题思路:
- 分别建立行、列和所在的九宫格box的哈希表来记录元素
- 遍历到每个数字
board[i][j]
的时候,需要判断它是否满足一下三个条件:- 是否在第i行出现过
- 是否在第j列出现过
- 是否在第index个box中出现过
- index的取值
- 从图中可以看出,box是由i和j共同确定的,对于第一排的三个box,序号是可以通过纵坐标唯一确定的,即j/3,但是第二排就需要用到横坐标了
- 据观察,同列不同行之间的box的index之间的差为3,第一排可以看做
j / 3
,则第二排需要在j / 3
的基础上加上 3,第三排同理,所以得出 index = j / 3 + i / 3 * 3
代码如下:
1 | public boolean isValidSudoku(char[][] board) { |