leetcode36:有效的数独

news2024/10/17 15:22:00

请你判断一个 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)或者 '.'

步骤 1:题目分析与定义

问题定义:
给定一个 9×99 \times 99×9 的数独棋盘,验证棋盘上已填入的数字是否符合数独规则:

  1. 每行中数字 1-9 不能重复。
  2. 每列中数字 1-9 不能重复。
  3. 每个 3×33 \times 33×3 的小方格内数字 1-9 不能重复。

输入:

  • 一个 9×99 \times 99×9 的二维数组 board,其中每个元素为字符 '1''9''.'(代表空格)。

输出:

  • 布尔值,true 表示数独有效,false 表示无效。

限制与边界条件:

  1. 棋盘大小固定为 9×99 \times 99×9。
  2. 数组中仅包含 '1''9''.'
  3. 棋盘可能只部分填充。

步骤 2:解题思路与算法设计

这是一个约束检查问题,解决方案需要验证三个条件(行、列、小方格)是否满足数独规则。考虑到问题的性质,使用集合存储已经出现的数字是较为高效的选择,这可以确保检查重复的操作在 O(1)O(1)O(1) 时间内完成。

方案概述
  1. 检查行:对于每一行,用一个集合来记录该行中已出现的数字。如果数字重复出现,则判定数独无效。
  2. 检查列:对每一列进行类似的检查,使用一个集合记录已出现的数字。
  3. 检查 3×33 \times 33×3 小方格:每个小方格可用集合记录出现的数字。遍历每个小方格的所有格子,检测是否有重复的数字。
最佳算法设计

我们可以在一次遍历中完成所有检查,采用三个集合数组来分别跟踪行、列和小方格中的数字。如下:

  1. 定义三个集合数组 rows[9]cols[9]boxes[9],分别用于存储行、列和小方格内的数字。
  2. 遍历整个棋盘,对于每个非 '.' 的格子,检查并更新相应的集合:
    • 如果数字已存在于对应的行集合 rows[row]、列集合 cols[col] 或小方格集合 boxes[box_index] 中,则返回 false
    • 否则,将数字添加到相应集合中。

复杂度分析:

  • 时间复杂度:O(81)=O(1)O(81) = O(1)O(81)=O(1),因为数独大小固定为 9×99 \times 99×9。
  • 空间复杂度:O(81)=O(1)O(81) = O(1)O(81)=O(1),我们只需三个固定大小的集合数组。
算法代码框架

该算法是一种直接的遍历与检查法,能够高效地检查数独有效性。


步骤 3:C++ 代码实现

步骤 4:解题启发与优化

启发:

  1. 集合的应用:使用集合来检测重复性操作是非常高效的,尤其在需要频繁检查和插入的场景下,集合的查找时间复杂度为 O(1)O(1)O(1)。
  2. 空间优化:可以进一步优化空间,将集合换成整型数组记录出现次数,但集合的可读性和代码简洁度较高。

效率提升:该算法遍历一次数独即可完成检查,适用于固定大小的棋盘,满足时间和空间复杂度需求,适合直接应用于生产环境。


步骤 5:算法实际应用

应用场景: 该算法可以应用于任何需要有效性检查和数据完整性验证的场景。例如在多维数据存储中,确保数据在行、列、或区域内不重复的约束要求。

实际应用示例: 在 仓库库存管理系统 中,可能需要确保某些特定区域(例如仓储格)内不会重复存放同一批次的产品。类似数独规则,每个仓储格有行、列、区域约束。这种算法可以用来自动检测仓库分区设置的有效性,避免重复存储。

实现方法: 设计一个与仓库布局一致的二维数组,模拟数独的行、列和区域约束,利用集合记录每个存储区域中已存入的批次号,防止重复存放,提高仓储效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2216105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详解腐烂的苹果(图+代码+广度优先遍历)

描述 给定一个 nm nm 的网格,其中每个单元格中可能有三种值中的一个 0 , 1 , 2。其中 0 表示这个格子为空、1 表示这个格子有一个完好的苹果,2 表示这个格子有一个腐烂的苹果。腐烂的苹果每分钟会向上下左右四个方向的苹果传播一次病菌,并导…

Elsevier旗下老牌TOP上榜On Hold名单!原因涉及“论文工厂”?

【SciencePub学术】上个月突发“On Hold”近10本期刊,看来科睿唯安又是闷声干大事。大家注意,On Hold期间,提交的论文是不能被检索到的,甚至此类期刊有可能随时被WOS目录剔除,所以请大家注意甄别,谨慎投递&…

快速理解http的get和post

在网络通信中,HTTP 协议扮演着非常重要的角色,而不同的 HTTP 方法决定了客户端与服务器之间的交互方式。 这里讲一下最常用的两种方法——GET 和 POST。 一、GET 方法 GET 方法用于从服务器获取资源。 这就像去图书馆借书——你向图书馆请求一本特定的…

Linux系统:sudo systemctl reload apache2命令作用

sudo systemctl reload apache2命令作用 sudo systemctl reload apache2 是一个用于重新加载 Apache Web服务器的命令。这个命令并不会停止然后重新启动服务,而是尝试重新加载配置文件,并对正在运行的服务进行无中断的重新加载。这通常用于在更改了Apach…

Karmada核心概念

以下内容为翻译,原文地址 Karmada 是什么? | karmada 一、Karmada核心概念 一)什么是Karmada 1、Karmada:开放,多云,多集群Kubernetes业务流程 Karmada (Kubernetes Armada)是一个Kubernetes管理系统&…

省出一套黑神话,光威神武DDR5 6800 C32 32GB内存条:游戏玩家的高性能选择

在游戏的世界里,每一帧的流畅度都可能决定胜负,尤其是那些对硬件规格要求较高的游戏来说,PC上每一种硬件的性能表现都至关重要。对于追求极致游戏体验的玩家来说,一款高性能的内存条是不可或缺的。前些年很多人可能还比较关注国际…

Linux下内核空间和用户空间内存映射图详解

目录 一、简介二、内存空间定义三、内存权限四、内存空间映射图4.1 32位系统4.2 64位系统4.3 映射空间解析 五、其他相关链接1、关于linux下内存管理内容总结2、Linux内核中kzalloc分配内存时用的参数GFP_KERNEL详解3、Linux下stream内存带宽测试参数和示例详解附源码总结 一、…

K8s的储存

一 configmap 1.1 configmap的功能 configMap用于保存配置数据,以键值对形式存储。 configMap 资源提供了向 Pod 注入配置数据的方法。 镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。 etcd限制了文件大小不能超过1M 1.2 configmap的使用场…

【C++】———— 日期类练习

目录 前言 时间类定义 成员函数具体实现 1.获取某年某月天数 2.构造函数 3.析构函数 4.拷贝构造 5.日期类的运算符重载 5.1赋值运算符重载 5.2 和 - - 的前置后置 5.3日期比较(> , < , > ,< , ,!) 5.4 、 、- 、- 5.5日期减日期&#xff0c;求差值…

搜维尔科技:Geomagic Touch触觉力反馈应用于医疗、工业、科研、危险环境等遥操作技术

医疗机器人遥操作&#xff1a; 在医疗领域&#xff0c;该设备可用于控制医疗机器人进行手术模拟训练。例如&#xff0c;外科医生可以通过 Geomagic Touch 设备操控机器人的末端器械&#xff0c;在虚拟环境中进行手术操作练习。医生在操作设备时能感受到机器人与虚拟组织或器官…

【可答疑】基于51单片机的自动洗手器(含仿真、代码、报告、演示视频等)

✨哈喽大家好&#xff0c;这里是每天一杯冰美式oh&#xff0c;985电子本硕&#xff0c;大厂嵌入式在职0.3年&#xff0c;业余时间做做单片机小项目&#xff0c;有需要也可以提供就业指导&#xff08;免费&#xff09;~ &#x1f431;‍&#x1f409;这是51单片机毕业设计100篇…

前端布局与响应式设计综合指南(三)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Css篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:前端布局与响应式设计综合指南(三) 目录 42、px/em/rem有什么区别&#xff1f;为什么通常给font-s…

JavaScript object(2)

这样的话&#xff0c;就变成只读了。

2022年华为杯数学建模竞赛D题论文和代码

PISA架构芯片资源排布研究 随着全球“芯”缺浪潮的持续发酵&#xff0c;作为“工业粮食”的芯片技术成为我国亟待突围的产业之一。PISA作为兼具良好处理速度与可编程性的交换芯片架构&#xff0c;有效缓解了传统固定功能的交换芯片研发效率低下的问题。为充分发挥芯片能力&…

2024-10-15 学习人工智能的Day7

在简单的了解完学习人工智能所需的高数、线代、概率论后&#xff0c;我们又重新开始了国庆的学习&#xff0c;因为已经有十余天没有接触python&#xff0c;所以今天的内容主要是对之前学习的python的回顾与总结&#xff0c;然后对各个部分进行了简单的实践&#xff0c;在最后学…

IPV6学习汇总

一、ICMPV6 ICMPv6&#xff08;Internet Control Message Protocol version 6&#xff09;&#xff0c;即互联网控制信息协议版本六&#xff0c;是为了与IPv6配套使用而开发的互联网控制信息协议。以下是关于ICMPv6的详细介绍&#xff1a; 一、基本功能 ICMPv6向源节点报告关…

【C#】使用Visual Studio创建Windows Forms应用程序计算对角线之和

文章目录 使用Visual Studio创建Windows Forms应用程序计算对角线之和步骤 1: 创建新的Windows Forms应用程序项目步骤 2: 设计窗体步骤 3: 编写代码步骤 4: 运行程序步骤 5: 运行结果 使用Visual Studio创建Windows Forms应用程序计算对角线之和 大家好&#xff01;今天&…

HCIP-HarmonyOS Application Developer 习题(十)

1、HarmonyOS设备A上的应用通过调用分布式任务调度的能力continuesbility&#xff0c;向设备B的应用发起跨端迁移&#xff0c;此过程属于跨端迁移中的哪个流程? A、流转准备 B、流转进行 C、流转结束 D、流转完成 答案&#xff1a;D 分析&#xff1a; 2、为了帮助用户通过全局…

大数据之hadoop(hdfs部分)

1.引入:为什么需要分布式存储? 一个服务器能存入海量数据吗?显然是不能,所以构建分布式解决了存入问题.多台服务器的协调工作也是性能的横向扩展. 总结: 1.数据量太大&#xff0c;单机存储能力有上限&#xff0c;需要靠数量来解决问题 2.数量的提升带来的是网络传输、磁盘读…

标准IO:fread/fwrite

使用fread和fwrite完成两个文件的拷贝&#xff0c;要求源文件和目标文件由外界输入 #include <myhead.h> int main(int argc, const char *argv[]) {//判断是否有3个文件传入if(3 ! argc){fputs("input file error\n",stderr);return -1;}//打开源文件FILE * …