1、题目

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可;
数字 1-9 在每一行只能出现一次;
数字 1-9 在每一列只能出现一次;
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

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

2、代码

from typing import Listclass Solution:def isValidSudoku(self, board: List[List[str]]) -> bool:# 整体思路:拿到所有需要比对的元素,然后进行重复判断。# (1)求解每一行所有的非点元素放入列表,求解每一列的非点元素放入列表,求解每一区域的非点元素放入列表# (2)然后判断所有数组是否存在重复元素,最终返回True和Falserow = []for y in board:row.append([x for x in y if x != '.'])col = []for y in zip(*board):col.append([x for x in y if x != '.'])pal = []for i in (0, 3, 6):for j in (0, 3, 6):pal.append([board[i + m][j + n] for m in range(3) for n in range(3) if board[i + m][j + n] != '.'])print(row)print(col)print(pal)return all(len(set(x)) == len(x) for x in (*row, *col, *pal))# 哈希表真好啊,效率真高row, col, sqrt = defaultdict(set), defaultdict(set), defaultdict(set)for i in range(9):for j in range(9):val = board[i][j]if val == '.':continuepoint = i // 3 * 3 + j // 3if val in row[i] or val in col[j] or val in sqrt[point]:print(i, j, val)print(row, col, sqrt)return Falserow[i].add(val)col[j].add(val)sqrt[point].add(val)return Trueif __name__ == '__main__':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"]]a = Solution()print(a.isValidSudoku(board))

3、思路

1、整体思路:拿到所有需要比对的元素,然后进行重复判断
(1)求解每一行所有的非点元素放入列表,求解每一列的非点元素放入列表,求解每一区域的非点元素放入列表;
(2)然后判断所有数组是否存在重复元素,最终返回True和False;
2、这道题其实是让我们判断行、列、九宫格内是否存在重复的元素,如果存在返回False,否则True,分别维护行、列、九宫格三个哈希表,然后每次判断是否存在即可。如何判断当前的单元格,在哪个九宫格中,简单推倒下就能得出:x // 3 * 3 + y // 3

初级算法_数组 --- 有效的数独相关推荐

  1. LeetCode_初级算法_数组

    LeetCode|初级算法_数组 题目如下: 1.1 从排序数组中删除重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间 ...

  2. LeetCode初级算法之数组:有效数独

    题目描述 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗 ...

  3. 初级算法_反转字符串

    LeetCode_初级算法_反转字符串 源 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 ...

  4. LeetCode初级算法之数组:36 有效数独

    01 题目描述 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一 ...

  5. 初级算法题->有效的数独--弄清哈希表的本质

    文章目录 题目 解法一:三个二维数组实现 解法二:三个一维数组利用单个位存储实现 题目 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只 ...

  6. 【LeetCode】初级算法:数组

    题目可以在LeetCode查看 1. 从排序数组中删除重复项 用时:11ms class Solution {public int removeDuplicates(int[] nums) {int ...

  7. 【初级算法】10.有效的数独

    题目: 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可.数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线 ...

  8. LeetCode初级算法(数组)解答

    这里记录了LeetCode初级算法中数组的一些题目: 加一 本来想先转成整数,加1后再转回去:耽美想到测试的例子考虑到了这个方法的笨重,所以int类型超了最大范围65536,导致程序出错. class ...

  9. [算法]力扣刷题-初级算法 - 数组(三)(数组篇完结) [两数之和] [有效的数独] [旋转图像]

    初级算法 - 数组篇完结: 初级算法 - 数组(一): https://blog.csdn.net/weixin_43854928/article/details/121315702 初级算法 - 数 ...

最新文章

  1. Android 图片缓存之内存缓存技术LruCache,软引用
  2. 将一个c 语言源程序文件中所有注释去掉后,存入另一个文件.,C实验内容.doc
  3. ObjectArx创建指定块
  4. 后台拿webshell的常用方法总结
  5. 乐高机器人教室布置图片大全_圣诞节手抄报内容简单图片漂亮
  6. mongo(四)索引
  7. 数据科学家 数据工程师_发展数据科学家和工程师
  8. input子系统分析二
  9. 南京农业大学计算机组成原理,2017年南京农业大学信息科学技术学院853计算机专业基础综合之计算机组成原理考研强化模拟题...
  10. Servlet3.0之八:基于Servlet3.0的文件上传@MultipartConfig
  11. 【基础教程】基于matlab处理音频文件基本用法【含Matlab源码 886期】
  12. 2017嵌入式软件行业现状及概述
  13. 几种数据可视化框架分析
  14. Canal部署linux mysql同步数据
  15. 公司法人没社保零申报,原来可以这样?
  16. 倍福--软件界面介绍
  17. c语言编程 设计密码锁,如何设计最简单的密码锁程序
  18. Exchange 2010环境部署2
  19. FIBOS社区发起人 响马:一个“极客硬核老炮儿”是怎样的?
  20. 项目经理成功的五个关键因素

热门文章

  1. 钱理群: 真正的鲁迅是沉默的
  2. linux dd if提示是目录,Linux dd 命令详解
  3. 一元四次方程求根实现
  4. 轻奢消费人群画像报告
  5. 11款产品原型设计工具
  6. 对路径“C:\inetpub\wwwroot\Test\Temper\”的访问被拒绝 【已解决】
  7. Python 文件处理
  8. python安装第三方库的方法
  9. 智力题:1000瓶酒.10只老鼠.有一瓶酒有毒,每只老鼠可以喝无限多的酒,如何测一次就找出哪瓶酒有毒
  10. Python0019 音频处理(二).wav文件