36. 有效的数独

183 阅读5分钟

【题目】

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

注意:

  • 一个有效的数独(部分已被填充)不一定是可解的。
  • 只需要根据以上规则,验证已经填入的数字是否有效即可。
  • 空白格用 '.' 表示。  

示例 1:

输入: board = 
[["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

示例 2:

输入: board = 
[["8","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"]]
输出: false
解释: 除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。

提示:

  • board.length == 9
  • board[i].length == 9
  • board[i][j] 是一位数字(1-9)或者 '.'

【题目解析】

思路

二维数组/哈希表

为了验证数独的有效性,我们可以采用二维数组或哈希表来记录每一行、每一列以及每一个3x3宫格中数字的出现情况。具体步骤如下:

  1. 初始化数据结构:创建用于记录的数据结构,每一行、每一列和每个宫格对应一个记录单元。
  2. 遍历数独板:逐个检查数独板上的每一个数字,对于非空格的数字,分别检查其在对应的行、列和宫格中是否已经出现过。
  3. 检查和更新:如果发现数字在其所在的行、列或宫格中已经出现过,则数独无效。否则,更新记录,表示该数字在对应的行、列和宫格中已出现。

执行

image.png

【总结】

“有效的数独”问题要求验证一个9x9的数独板是否符合特定的规则:每行、每列及每个3x3的宫格内的数字1-9必须唯一出现。该问题的解决方案不仅体现了数据结构在算法设计中的应用,也展示了如何高效处理和验证复杂数据集的一致性和有效性。

适用问题类型

使用二维数组或哈希表来跟踪记录的方法非常适合于处理以下类型的问题:

  • 数据集合中的元素唯一性验证问题。
  • 需要分区检查数据一致性或完整性的场景,如数独中的3x3宫格验证。
  • 大规模数据处理中的快速查找、记录和更新操作,尤其是当操作涉及到多维数据结构时。

解决算法:二维数组/哈希表记录法

本问题采用的基本算法是通过二维数组或哈希表来跟踪每个数字在行、列和宫格中的出现情况。算法的关键在于将问题分解为多个子问题(行、列、宫格的验证),并针对每个子问题维护一个数据结构来记录状态。这种方法的优点在于:

  • 高效性:通过直接访问数据结构中的记录来快速判断数字的唯一性,实现了对问题的高效处理。
  • 灵活性:该方法不仅适用于数独验证,同样的思路和技术也可以应用于其他需要元素唯一性验证的问题。
  • 扩展性:通过调整数据结构的设计,可以处理更复杂或更大规模的数据验证问题。

算法特点

  • 时间复杂度:O(1),虽然涉及到遍历整个数独板,但由于数独的大小是固定的(9x9),因此从大O记号的角度看,该算法的时间复杂度可以视为常数时间复杂度。
  • 空间复杂度:O(1),同样因为数独的大小是固定的,所以用于记录状态的数据结构所占用的空间也是常数级别的。

算法优化与实践意义

在实际应用中,算法的优化可以从减少不必要的检查和更新操作入手。例如,当发现数独已经无效时,可以立即终止后续的检查过程。此外,深入理解并掌握这种使用数据结构进行状态记录和更新的技术,对于解决实际编程问题具有重要的价值。它不仅能够提高问题解决的效率和效果,也有助于提升算法设计和数据结构应用的能力。

总之,“有效的数独”问题及其解法不仅是一次对数独游戏规则的验证挑战,也是对算法设计思想和数据结构应用技巧的一次深入探索和实践。通过这种方法解决问题,我们能够更好地理解数据结构在算法中的作用,以及如何通过合理的数据组织和访问策略来高效处理复杂问题。

题目链接

有效的数独