面试经典150题——有效的数独

news2024/11/24 19:04:10

​"Strive not to be a success, but rather to be of value." 

- Albert Einstein

brown wooden bench beside tree

1. 题目描述

2.  题目分析与解析

2.1 暴力求解

没思路,老规矩,先来一次笨办法,先把步子迈出去,因为可能笨办法写着写着就会有更多的理解,从而产生新的思路。这个题目暴力求解还是挺容易理解的,就是看每一行,每一列,以及每个粗线包括的3×3方框是否有重复的1-9的数字,出现直接返回false,都没出现返回true。

代码思路:

  • 一次for遍历每一行

  • 一次for遍历每一列

  • 一次for遍历每个3×3方块

  • 使用一个9个元素的数组记录出现的次数当,某一个数字出现不止一次返回false。

但是运行之后没想到效果还挺好:

然后我开始也很震惊,明明这种暴力求解的方法看起来很复杂,但是我又思考了一下,想到为什么能获得这样的效果,就是其实我只进行了三次遍历所有元素的操作,因为矩阵是N×N的,实际上虽然遍历矩阵的时间复杂度是O(N^2),但是只进行了三次遍历,也就是O(3*N^2),复杂度最终是O(N^2)。

2.2 思路二——优化

现在思考一下,本质上我们的暴力求解其实就是寻找数组中每一个元素对于当前行或者当前列,或者当前3×3的小方块的影响,那我们是不是可以把每一个位置对于这三种情况的影响存储起来,就不需要每一次针对一种情况去重新看它在该种情况下造成的影响呢?

答案是可以的,由于我们在遍历board数组的任意一个位置,其实我们是可以将该位置对于其所在行,所在列以及3×3小方块先存储起来的,这样就可以一次性遍历所有二维数组元素同时判定结果。实际上就是空间换时间。

空间换时间的本质:其实就是开辟额外的空间,将我已经走过的地方的需要的信息尽可能存储起来,减少回过头去收集信息的开销。

代码思路:

  • 两层for循环是肯定的,因为要遍历所有元素

  • 对于每一行,使用一个数组记录,一共9个Boolean 数组

  • 对于每一列,使用一个数组记录,一共9个Boolean 数组

  • 对于3×3的小方块,总共可以看出有9个3×3小方块,所以也使用9个Boolean 数组

  • 对于每一个遍历到的元素,首先判断它对应的行的影响,将它对所在列以及3×3方块的影响存储起来:

    • 如果对应的位置是false,表示先前没有元素,置为true。

    • 如果为true,则表示有重复元素,返回false

3. 代码实现

3.1 暴力求解

3.2 优化

之所以运行效果差别不大就是因为二者的复杂度都是O(N^2),只不过暴力解法遍历了三次,优化方法只遍历了一次,而且矩阵也比较小,所以运行效果差异不明显。

4. 相关复杂度分析

4.1 暴力求解

时间复杂度
  • 遍历每一行:对于每行,都要检查9个元素是否满足数独的条件,因此时间复杂度为O(9x9)。

  • 遍历每一列:同样地,需要遍历每列的9个元素,时间复杂度为O(9x9)。

  • 遍历每一个3x3的小方格:总共有9个小方格,每个小方格内部再进行9次操作来检查元素,时间复杂度为O(9x9)。

总的来说,每个单独的步骤都是对81个单元格进行操作,所以总时间复杂度为O(3x9x9),简化后仍然是O(9x9)。

空间复杂度
  • 对于每一行、每一列、每个3x3的小方格,都有一个单独的布尔数组来记录数字是否出现过,这个数组的大小是9。

  • 因为这些数组是在遍历过程中被创建,并在每次遍历开始时重新初始化,所以它们不会同时存在。

总的空间复杂度为O(9),即在任何时刻,最多有一个长度为9的布尔数组在使用中。

4.2 优化

时间复杂度
  • 这个方法通过一次遍历来检查行、列、和3x3的小方格的有效性。对于每个元素,进行一系列的检查(包括行、列、小方格),每次检查的时间复杂度都是O(1)。

  • 总体上,需要遍历整个9x9的数独板一次,所以时间复杂度为O(9x9)。

空间复杂度
  • 使用了三个二维布尔数组来分别记录列、行和3x3小方格内数字是否已经出现过。每个数组的大小为9x9。

  • col数组用于记录每一列数字是否出现过,row数组在每次行的遍历开始时初始化,而box数组的处理稍微复杂一些,但本质上是对每个小方格进行跟踪。

总的空间复杂度为O(9x9) + O(9x9) + O(3x9),即主要由三个二维数组的大小决定,可以简化为O(9x9)。在第二种解法中,尽管box数组在逻辑上是一个3x9的数组,但实际上为了简化索引计算和逻辑处理,通常会使用9x9的数组来表示所有的小方格,因此这里按照最终实现可能占用的空间来估算。

4.3 结论

  • 时间复杂度方面,两种方法都是O(9x9),因为它们都需要遍历整个数独板。

  • 空间复杂度方面,第一种方法为O(9),因为它在任何时刻最多使用一个大小为9的布尔数组。第二种方法的空间复杂度提高到了O(9x9),因为它同时使用了多个二维数组来跟踪行、列和3x3小方格中数字的出现情况,但是如果对于很大的矩阵来讲,第二种方法会更好,因为它只需要遍历一次整个数组,而第一种方法需要遍历三次。

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

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

相关文章

STM32 HAL库 STM32CubeMX -- IWDG(独立看门狗)

STM32 HAL库 STM32CubeMX -- IWDG 一、IWDG简介二、独立看门狗的工作原理三、驱动函数初始化函数HAL IWDG Init()初始化函数HAL IWDG Init()其他宏函数 四、超时时间计算第一种办法第二种办法(推荐) 一、IWDG简介 看门狗(Watchdog)就是MCU上的一种特殊的…

企业数字化转型战略规划与实践:迈向未来的关键之举

在信息技术的不断革新和全球数字化浪潮的推动下,企业数字化转型已经成为当今商业世界中不可或缺的一项战略规划。随着技术的进步,企业必须积极应对数字化转型的挑战,并将其作为发展的关键驱动力。本文将探讨企业数字化转型的重要性&#xff0…

JavaWeb之Servlet接口

Servlet接口 什么是Servlet? Servlet是一种基于Java技术的Web组件,用于生成动态内容,由容器管理,是平台无关的Java类组成,并且由Java Web服务器加载执行,是Web容器的最基本组成单元 什么是Servlet容器&…

浅谈电商场景中的扣除库存问题

库存 一、场景二、扣减时机1.下单时扣库存2.支付完成扣库存3.预扣除 三、库存存储方案1.数据库存储2.数据库缓存混合存储 四、整体方案1.单数据库方案2.主从数据库方案3.主从数据库缓存方案4.数据库缓存混合存储 五、其他情况1.秒杀QPS过高2.Redis QPS过高3.Master DB QPS过高4…

java生态环境评价Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 生态环境评价管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysq…

【sgCreateTableColumn】自定义小工具:敏捷开发→自动化生成表格列html代码(表格列生成工具)[基于el-table-column]

源码 <template><!-- 前往https://blog.csdn.net/qq_37860634/article/details/136126479 查看使用说明 --><div :class"$options.name"><div class"sg-head">表格列生成工具</div><div class"sg-container"…

问题:人的安全知识和技能是天生的。() #媒体#知识分享#学习方法

问题&#xff1a;人的安全知识和技能是天生的。&#xff08;) 人的安全知识和技能是天生的。() 参考答案如图所示 问题&#xff1a;&#xff08;&#xff09;是党和国家的根本所在、命脉所在&#xff0c;是全国各族人民的利益所在、幸福所在。 A.人民当家作主 B.坚持和完善…

Crypto-RSA3

题目&#xff1a;&#xff08;BUUCTF在线评测 (buuoj.cn)&#xff09; 共模攻击 ​ 前提&#xff1a;有两组及以上的RSA加密过程&#xff0c;而且其中两次的m和n都是相同的&#xff0c;那么就可以在不计算出d而直接计算出m的值。 ​ 设模数为n&#xff0c;两个用户的公钥分别为…

JavaScript中什么是事件委托

JavaScript 中的事件委托&#xff08;Event delegation&#xff09;是一种重要的编程技术&#xff0c;它能够优化网页中的事件处理&#xff0c;提高程序的性能和可维护性。本文将详细介绍事件委托的概念、工作原理&#xff0c;并提供示例代码来说明其实际应用。 事件委托是基于…

ARM编译器5.06下载安装

ARM编译器5.06下载安装 1.官网下载 进入官方网站ARM Complier v5.06官网下载页面 进入后的界面为 往下翻&#xff0c;找到如图位置的5.06 for windows的文件&#xff0c;点击下载&#xff0c;下载时需要登录账号 2.安装 先解压下载的压缩文件&#xff0c;在installer文件夹里…

英文单词-计算: calculate、count、compute、reckon

英文单词-计算: calculate、count、compute、reckon count 数数; 计算总数; 重要; 包括在内; 正式认可; 认为; 被视作; compute 计算&#xff0c;估算; calculate 计算; 估算; 估计; 预料; reckon 测算&#xff0c;估计; 认为; 计算; 评定&#xff0c;断定; 这四个单词 “c…

文件管理大师:深入解析Linux的文件与目录操控

目录 一、文件命名规则 1、可以使用哪些字符? 2、文件名的长度 3、Linux文件名大小写 4、Linux文件扩展名 二、文件管理命令 1、目录创建/删除 mkdir创建目录 直接创建文件夹 创建多个文件夹 递归创建写法 总结mkdir 删除空目录 2、文件创建、删除 touch创建文…

数解 transformer 之 self attention transformer 公式整理

千万不要从任何角度轻看 transformer&#xff0c;重要的话说四遍&#xff1a; 千万不要从任何角度轻看 transformer 千万不要从任何角度轻看 transformer 千万不要从任何角度轻看 transformer Attention is all you need 整个项目是鬼斧神工之作&#xff0c;巧夺天工之作&a…

C语言程序设计(第四版)—习题7程序设计题

目录 1.选择法排序。 2.求一批整数中出现最多的数字。 3.判断上三角矩阵。 4.求矩阵各行元素之和。 5.求鞍点。 6.统计大写辅音字母。 7.字符串替换。 8.字符串转换成十进制整数。 1.选择法排序。 输入一个正整数n&#xff08;1&#xff1c;n≤10&#xff09;&#xf…

SpringBoot RabbitMQ收发消息、配置及原理

今天分析SpringBoot通过自动配置集成RabbitMQ的原理以及使用。 AMQP概念 RabbitMQ是基于AMQP协议的message broker&#xff0c;所以我们首先要对AMQP做一个简单的了解。 AMQP (Advanced Message Queuing Protocol) is a messaging protocol that enables conforming client a…

Springmvc 的参数绑定之list集合

标签中name属性的值就是pojo类的属性名 参数绑定4 list [对象] <form action"teaupd.do" method"post"> <c:forEach items"${list}" var"tea" varStatus "status"> 教师编号&#xff1a;<input…

大模型专题:2023爱分析·大模型厂商全景报告

今天分享的是大模型系列深度研究报告&#xff1a;《大模型专题&#xff1a;2023爱分析大模型厂商全景报告》。 &#xff08;报告出品方&#xff1a;爱分析&#xff09; 报告共计&#xff1a;80页 研究范围定义 大模型是指通过在海量数据上依托强大算力资源进行训练后能完成…

统计图环形图绘制方法

统计图环形图绘制方法 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制&#xff0c;饼图环形图绘制较难。 在网上看到一种类很有艺术感的环形图图例&#xff0c;一时手痒也就搞了一个绘制方法。 本方法采用C语言的最基本功能&…

每日OJ题_算法_递归④力扣24. 两两交换链表中的节点

目录 ④力扣24. 两两交换链表中的节点 解析代码 ④力扣24. 两两交换链表中的节点 24. 两两交换链表中的节点 难度 中等 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即…

08-静态pod(了解即可,不重要)

我们都知道&#xff0c;pod是kubelet创建的&#xff0c;那么创建的流程是什么呐&#xff1f; 此时我们需要了解我们k8s中config.yaml配置文件了&#xff1b; 他的存放路径&#xff1a;【/var/lib/kubelet/config.yaml】 一、查看静态pod的路径 [rootk8s231 ~]# vim /var/lib…