问题描述
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 digits1-9
without repetition.
A partially filled sudoku which is valid.
The Sudoku board could be partially filled, where empty cells are filled with the character '.'
.
Example 1:
1 | Input: |
Example 2:
1 | Input: |
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
.
Related Topics: Hash Table
原问题: 36. Valid Sudoku
中文翻译版: 36. 有效的数独
解决方案
方案1
根据题目说明,一个有效的数独,满足三个条件:
- 每行数字有重复数字
- 每列不能有重复数字
- 每个
3x3
块中不能有重复数字
怎么判断一行、一列或者一个小块中是否有重复数字,此时我们可以给用哈希表进行快速查找判断。首先我们分别给每一行、每一列以及每一小块建立一个哈希表,然后我们遍历所有数字,当遍历到某个数字时,我们根据该数字所处的行、列以及小块找到对应的哈希表,查找该数字是否在哈希表中出现,如果出现,说明该数独是无效的,否则我们将该数字存入哈希表,继续遍历。
参考解题代码1
1 |
|
方案2
同方案1的思想,只不过此时一行、一列以及一小块对应的哈希表分别用一个整数进行替代,通过该整数的某一位是否为1来进行重复数字判断,主要使用的是位与运算 &
和位或运算 |
。当遍历到某个数字 x
时,该数字所在行对应的整数为 y
,此时判断该数字是否重复可以进行如下操作:
1 | y & (1 << x) |
如果该表达式值非0,说明 y
的第 x
位是1,这说明该数字之前出现过,否则该表达式值为0。如果该数字未重复出现,则 y
设为:
1 | y = y | (1 << x) |
参考解题代码2
1 |
|