【LeetCode - 每日1题】解数独
🌈 个人主页:(时光煮雨)
🔥 高质量专栏:vulnhub靶机渗透测试
👈 希望得到您的订阅和支持~
💡 创作高质量博文(平均质量分95+),分享更多关于网络安全、Python领域的优质内容!(希望得到您的关注~)
🌵目录🌵
- 难度 ⭐⭐⭐⭐⭐
- ✅解题思路
-
- 💖概述
- 💓核心思路
- ✅代码实现
- ✅ 复杂度分析
- ✅ 测试用例验证
-
- ✅ 示例1(有效数独)
- ✅ 示例2(无效数独-行重复)
- ✅ 边缘用例(空盘)
- 💖总结
- 🤝 期待与你共同进步
- 📚 参考文档
难度 ⭐⭐⭐⭐⭐
✅解题思路
💖概述
本题要求验证一个9×9数独板的当前状态是否有效,而不需要求解。验证规则包括:
- 每行必须包含数字1-9且无重复
- 每列必须包含数字1-9且无重复
- 每个3×3子网格必须包含数字1-9且无重复
- 空格"."可忽略,只需验证已填数字
💓核心思路
使用一个集合seen同时跟踪三类规则(行、列、子网格)的数字出现情况。通过为每个数字在行、列和子网格中的出现创建唯一标识符,并在遍历过程中检查这些标识符是否重复出现。
关键创新点:
- 统一标识设计:为每个数字在行、列和子网格中的出现创建格式化的字符串标识符
- 单集合跟踪:使用一个集合同时记录三类规则的状态,节省空间
- 子网格映射:利用i//3和j//3将坐标映射到3×3子网格区域
- 提前终止:发现重复标识符立即返回False,优化性能
✅代码实现
from typing import Listclass Solution:def isValidSudoku(self, board: List[List[str]]) -> bool:seen = set()for i in range(9):for j in range(9):num = board[i][j]if num != '.':# 创建三类规则的唯一标识符row_id = f"{num} in row {i}"col_id = f"{num} in col {j}"box_id = f"{num} in box {i//3},{j//3}"