LeetCode 题解


LeetCode 题解 | 36. 有效的数独


36. 有效的数独点击查看题目

题目描述

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

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
LeetCode 题解 | 36. 有效的数独

上图是一个部分填充的有效的数独

数独部分空格内已填入了数字,空白格用 '.' 表示。

示例 1:

LeetCode 题解 | 36. 有效的数独

示例 2:

LeetCode 题解 | 36. 有效的数独

说明:

  • 一个有效的数独(部分已被填充)不一定是可解的。
  • 只需要根据以上规则,验证已经填入的数字是否有效即可。
  • 给定数独序列只包含数字 1-9 和字符 '.' 。
  • 给定数独永远是 9x9 形式的。


解决方案

思路

一个简单的解决方案是遍历该 9 x 9 数独 三 次,以确保:

  • 行中没有重复的数字。
  • 列中没有重复的数字。
  • 3 x 3 子数独内没有重复的数字。

实际上,所有这一切都可以在一次迭代中完成。


方法:一次迭代

首先,让我们来讨论下面两个问题:

  • 如何枚举子数独?

可以使用 box_index = (row / 3) * 3 + columns / 3,其中 / 是整数除法。

LeetCode 题解 | 36. 有效的数独

  • 如何确保行 / 列 / 子数独中没有重复项?

可以利用 value -> count 哈希映射来跟踪所有已经遇到的值。

现在,我们完成了这个算法的所有准备工作:

  • 遍历数独。
  • 检查看到每个单元格值是否已经在当前的行 / 列 / 子数独中出现过:
  • 如果出现重复,返回 false。
  • 如果没有,则保留此值以进行进一步跟踪。
  • 返回 true。


图片详解

LeetCode 题解 | 36. 有效的数独

LeetCode 题解 | 36. 有效的数独


LeetCode 题解 | 36. 有效的数独


LeetCode 题解 | 36. 有效的数独


LeetCode 题解 | 36. 有效的数独


LeetCode 题解 | 36. 有效的数独


LeetCode 题解 | 36. 有效的数独


LeetCode 题解 | 36. 有效的数独


LeetCode 题解 | 36. 有效的数独


LeetCode 题解 | 36. 有效的数独


LeetCode 题解 | 36. 有效的数独


LeetCode 题解 | 36. 有效的数独


LeetCode 题解 | 36. 有效的数独


LeetCode 题解 | 36. 有效的数独


LeetCode 题解 | 36. 有效的数独


Java 实现


LeetCode 题解 | 36. 有效的数独

Python 实现

LeetCode 题解 | 36. 有效的数独

复杂度分析

时间复杂度:O(1),因为我们只对 81 个单元格进行了一次迭代。

空间复杂度:O(1)。



分享到:


相關文章: