哈希表题目:矩阵置零
文章目录
- 题目
- 标题和出处
- 难度
- 题目描述
- 要求
- 示例
- 数据范围
- 进阶
- 解法一
- 思路和算法
- 代码
- 复杂度分析
- 解法二
- 思路和算法
- 代码
- 复杂度分析
- 解法三
- 思路和算法
- 代码
- 复杂度分析
题目
标题和出处
标题:矩阵置零
出处:73. 矩阵置零
难度
3 级
题目描述
要求
给定一个 m×n\texttt{m} \times \texttt{n}m×n 的矩阵,如果一个元素为 0\texttt{0}0,则将其所在行和列的所有元素都设为 0\texttt{0}0。
请使用原地算法。
示例
示例 1:
输入:matrix=[[1,1,1],[1,0,1],[1,1,1]]\texttt{matrix = [[1,1,1],[1,0,1],[1,1,1]]}matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]\texttt{[[1,0,1],[0,0,0],[1,0,1]]}[[1,0,1],[0,0,0],[1,0,1]]
示例 2:
输入:matrix=[[0,1,2,0],[3,4,5,2],[1,3,1,5]]\texttt{matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]}matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]\texttt{[[0,0,0,0],[0,4,5,0],[0,3,1,0]]}[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
数据范围
- m=matrix.length\texttt{m} = \texttt{matrix.length}m=matrix.length
- n=matrix[0].length\texttt{n} = \texttt{matrix[0].length}n=matrix[0].length
- 1≤m,n≤200\texttt{1} \le \texttt{m, n} \le \texttt{200}1≤m, n≤200
- -231≤matrix[i][j]≤231−1\texttt{-2}^\texttt{31} \le \texttt{matrix[i][j]} \le \texttt{2}^\texttt{31} - \texttt{1}-231≤matrix[i][j]≤231−1
进阶
- 一个直观的解决方案是使用 O(mn)\texttt{O(mn)}O(mn) 的额外空间,但这并不是一个好的解决方案。
- 一个简单的改进方案是使用 O(m+n)\texttt{O(m + n)}O(m + n) 的额外空间,但这仍然不是最好的解决方案。
- 你能想出一个仅使用常量空间的解决方案吗?
解法一
思路和算法
最直观的做法是找到矩阵中所有等于 000 的元素,对于每个元素 000,将其所在行和列的所有元素置零。
如果直接在原矩阵中将元素置零,则无法判断等于 000 的元素是原始值等于 000 还是被置零,因此需要创建辅助矩阵,辅助矩阵和原矩阵的大小相同,辅助矩阵中的每个元素表示原矩阵中的该元素是否置零。
遍历原矩阵,对于原矩阵中每个等于 000 的元素,将辅助矩阵中相应位置的相同行和相同列的元素都设为置零。然后再次遍历原矩阵和辅助矩阵,对于辅助矩阵中置零的位置,将原矩阵中相应位置的元素置零。
代码
class Solution {public void setZeroes(int[][] matrix) {int m = matrix.length, n = matrix[0].length;boolean[][] zero = new boolean[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (matrix[i][j] == 0) {for (int k = 0; k < n; k++) {zero[i][k] = true;}for (int k = 0; k < m; k++) {zero[k][j] = true;}}}}for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (zero[i][j]) {matrix[i][j] = 0;}}}}
}
复杂度分析
-
时间复杂度:O(mn(m+n))O(mn(m + n))O(mn(m+n)),其中 mmm 和 nnn 分别是矩阵 matrix\textit{matrix}matrix 的行数和列数。需要遍历矩阵两次,第一次遍历需要将元素 000 所在行和列的所有元素标为置零,每个元素需要 O(m+n)O(m + n)O(m+n) 的处理时间,第二次遍历将矩阵中的标为置零的元素置零,每个元素需要 O(1)O(1)O(1) 的处理时间,因此总时间复杂度是 O(mn(m+n))O(mn(m + n))O(mn(m+n))。
-
空间复杂度:O(mn)O(mn)O(mn),其中 mmm 和 nnn 分别是矩阵 matrix\textit{matrix}matrix 的行数和列数。需要创建和原矩阵大小相同的辅助矩阵记录原矩阵中的每个元素是否置零。
解法二
思路和算法
解法一的时间复杂度和空间复杂度都较高,可以优化。
由于矩阵中每个元素 000 所在行和列的所有元素需要置零,因此只需要记录矩阵的每一行和每一列是否需要置零即可。
创建两个哈希表分别记录矩阵的每一行和每一列是否需要置零,遍历矩阵一次,对于每个等于 000 的元素,在两个哈希表中分别记录其所在行和列需要置零,遍历结束之后即可得到所有需要置零的行和列。然后再次遍历矩阵,对于每个元素,如果两个哈希表中至少有一个哈希表记录了该元素所在的行或列需要置零,则将该元素置零。
实现方面,可以用两个数组分别记录矩阵的每一行和每一列是否需要置零。
代码
class Solution {public void setZeroes(int[][] matrix) {int m = matrix.length, n = matrix[0].length;boolean[] rows = new boolean[m];boolean[] columns = new boolean[n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (matrix[i][j] == 0) {rows[i] = true;columns[j] = true;}}}for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (rows[i] || columns[j]) {matrix[i][j] = 0;}}}}
}
复杂度分析
-
时间复杂度:O(mn)O(mn)O(mn),其中 mmm 和 nnn 分别是矩阵 matrix\textit{matrix}matrix 的行数和列数。需要遍历矩阵两次,第一次遍历需要将元素 000 所在行和列在两个哈希表中记录,每个元素需要 O(1)O(1)O(1) 的处理时间,第二次遍历将矩阵中的标为置零的元素置零,每个元素需要 O(1)O(1)O(1) 的处理时间,因此总时间复杂度是 O(mn)O(mn)O(mn)。
-
空间复杂度:O(m+n)O(m + n)O(m+n),其中 mmm 和 nnn 分别是矩阵 matrix\textit{matrix}matrix 的行数和列数。需要创建两个哈希表(或数组)分别记录矩阵的每一行和每一列是否需要置零,各需要 O(m)O(m)O(m) 和 O(n)O(n)O(n) 的空间。
解法三
思路和算法
解法二仍需要 O(m+n)O(m + n)O(m+n) 的额外空间。如果要将空间复杂度降低到 O(1)O(1)O(1),必须在矩阵内部记录每一行和每一列是否需要置零。
在矩阵内部记录置零信息,可以使用第 000 行和第 000 列记录。第 000 行的一个元素如果是 000,则表示该元素所在列需要置零;第 000 列的一个元素如果是 000,则表示该元素所在行需要置零。
如果直接修改矩阵的第 000 行和第 000 列的元素,则无法记录矩阵的第 000 行和第 000 列是否需要置零,因此需要使用两个变量分别记录矩阵的第 000 行和第 000 列是否需要置零。
矩阵置零的完整过程如下。
-
遍历矩阵的第 000 行和第 000 列,记录矩阵的第 000 行和第 000 列是否需要置零。
-
遍历矩阵的其余元素(指除了第 000 行和第 000 列的全部元素,下同),对于每个等于 000 的元素,将其所在行的第 000 列的元素和所在列的第 000 行的元素置零。
-
再次遍历矩阵的其余元素,对于每个元素,如果一个元素所在的行或列需要置零,则将该元素置零。
-
如果矩阵的第 000 行需要置零,则将矩阵的第 000 行元素全部置零;如果矩阵的第 000 列需要置零,则将矩阵的第 000 列元素全部置零。
如果矩阵的第 000 行或第 000 列的一个元素原本就是 000,则该元素所在行和列需要置零,上述解法同样适用于该情况。
代码
class Solution {public void setZeroes(int[][] matrix) {int m = matrix.length, n = matrix[0].length;boolean rowZero = false, columnZero = false;for (int j = 0; j < n; j++) {if (matrix[0][j] == 0) {rowZero = true;break;}}for (int i = 0; i < m; i++) {if (matrix[i][0] == 0) {columnZero = true;break;}}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (matrix[i][j] == 0) {matrix[i][0] = 0;matrix[0][j] = 0;}}}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (matrix[i][0] == 0 || matrix[0][j] == 0) {matrix[i][j] = 0;}}}if (rowZero) {for (int j = 0; j < n; j++) {matrix[0][j] = 0;}}if (columnZero) {for (int i = 0; i < m; i++) {matrix[i][0] = 0;}}}
}
复杂度分析
-
时间复杂度:O(mn)O(mn)O(mn),其中 mmm 和 nnn 分别是矩阵 matrix\textit{matrix}matrix 的行数和列数。最多需要遍历矩阵中的每个元素两次。
-
空间复杂度:O(1)O(1)O(1)。
相关文章:
哈希表题目:矩阵置零
文章目录题目标题和出处难度题目描述要求示例数据范围进阶解法一思路和算法代码复杂度分析解法二思路和算法代码复杂度分析解法三思路和算法代码复杂度分析题目 标题和出处 标题:矩阵置零 出处:73. 矩阵置零 难度 3 级 题目描述 要求 给定一个 m…...
HTTP API自动化测试从手工到平台的演变
不管是 Web 系统,还是移动 APP,前后端逻辑的分离设计已经是常态化,相互之间通过 API 调用进行数据交互。在基于 API 约定的开发模式下,如何加速请求 / 响应的 API 测试,让研发人员及早参与到调试中来呢?既然…...
【从零开始学C语言】知识总结一:C语言的基本知识汇总
C语言期末知识点总结 C语言期末试题(附答案)选择题编程题 2022C语言知识点大全【详细、必备】 C语言期末大作业-学生成绩管理系统(完整源码设计报告) C语言期末作业(15个)-货物管理系统、歌曲信息管理系…...
CAD二次开发 添加按钮Ribbon
这篇文章是教大家怎样子创建自己的Ribbon按钮界面(如下图),以下示例代码在CAD2020中运行实现。 背景 创建一个属于自己的Ribbon按钮(如下图) 理解Ribbon、Panel、Tab的关系(如下图)ÿ…...
[RK3568 Android12] 添加自定义启动脚本
1:定义添加的脚本 比如为displayn2k.sh #!/system/bin/sh log "displayn2k.sh begin running" sleep 5 log "displayn2k.sh sleep 8" sleep 5 log "================sleep finished==========================" #remount /system/bin/mount -o …...
API 体系构建
前言 API 是模块或者子系统之间交互的接口定义。好的系统架构离不开好的 API 设计,而一个设计不够完善的 API 则注定会导致系统的后续发展和维护非常困难。在关键环节制定明确的 API 规范有助于 Service 对内提高产品间互通的效率,对外提供一致的使用体…...
RMPE: Regional Multi-Person Pose Estimation (AlphaPose)阅读笔记
区域多人姿态估计 ICCV 2017 论文链接 代码链接 摘要: 野外多人姿态估计具有挑战性。sota人体检测器不可避免存在定位和识别误差,这些误差可能导致依赖人体检测器的单人姿态估计器(SPPE)的失败。本文提出了一种新的区域多人姿态估…...
2月16日昆明面试经历部分考题
2月16日昆明面试部分考题 1.说说em和rem的区别?rpx呢? rem是相对于根元素(HTML)进行计算,而em是相对于当前元素或父元素的字体大小,如果当前文本的字体尺寸没有设置,则相对于浏览器的默认字体…...
ARC140D One to One
ARC140D One to One 题目大意 对于一个长度为nnn的整数序列X(x1,x2,…xn)X(x_1,x_2,\dots x_n)X(x1,x2,…xn),每个元素都在111到nnn之间,令f(X)f(X)f(X)表示以下问题的答案: 有一个nnn个顶点nnn条边的无向图(可能有重边和…...
联合身份验证与Cognito
Hello大家好,我们接下来讨论AWS联合身份验证的内容。 AWS联合身份验证 对于考试,联合身份验证部分是一块非常重要的内容。那什么是联合身份验证,它是做什么用的呢? 联合身份验证,是用来允许AWS外部用户,如…...
day18_常用API之String类丶Object类
String概述 java.lang.String 类代表字符串,String类定义的变量可以用于指向字符串对象,同时String类提供了很多操作字符串的功能,我们可以直接使用。Java 程序中的所有字符串文字(例如“abc”)都为此类的对象 特点:St…...
OSG三维渲染引擎编程学习之五十五:“第五章:OSG场景渲染” 之 “5.13 一维纹理”
目录 第五章 OSG场景渲染 5.13 一维纹理 5.13.1 一维纹理介绍 5.13.2 一维纹理示例 第五章 OSG场景渲染 OSG存在场景树和渲染树,“场景数”的构建在第三章“OSG场景组织”已详细阐明,本章开始...
RTOS随笔之FreeRTOS启动与同步方法
RTOS启动与同步机制RTOS启动任务切换场景任务同步机制队列信号量事件组任务通知任务延时RTOS启动 FreeRTOS在任务创建完成后调用函数vTaskStartScheduler()启动任务调度器。 vTaskStartScheduler()任务启动函数详解 void vTaskStartScheduler( void ) {BaseType_t xReturn;xR…...
【AI/NLP】InstructGPT数据标注问题
文章目录1 背景介绍2 标记员筛选2.1 标记员筛选标准3 数据集及其标注3.1 预训练3.2 微调3.2.1 SFT-demonstration data3.2.2 RM-comparison data3.3 数据集大小4 模型实现1 背景介绍 ChatGPT的训练过程与InstructGPT相近,大致分为三步: SFT:…...
三次握手和四次挥手
文章目录TCP三次握手为什么要三次握手三次握手可以携带数据吗?三次握手失败,服务端会如何处理?ISN代表什么,意义,何要动态随机什么是半连接队列第2次握手传回了ACK,为什么还要传回SYN?为什么要四次挥手TCP…...
Jmeter常用断言之响应断言详解
响应断言是最常用的一种断言方法,主要是对响应结果中的文本内容进行断言,比如响应结果是否包含指定的值,或者是否等于指定的值。响应断言可以适用各种返回类型的响应结果,如:Test、html、application/json、applicatio…...
【Python学习笔记】36.Python3 MySQL - mysql-connector 驱动(1)
前言 MySQL 是最流行的关系型数据库管理系统,本章节为大家介绍使用 mysql-connector 来连接使用 MySQL, mysql-connector 是 MySQL 官方提供的驱动器。 Python3 MySQL - mysql-connector 驱动 我们可以使用 pip 命令来安装 mysql-connector࿱…...
计算机SCI论文课题设计需要注意什么? - 易智编译EaseEditing
课题设计就要本着严谨性和可行性来进行。实验设计的类型要选择准确,统计学的方法要运用合理,研究对象和观察指标的选择也要符合研究目的的要求,技术路线要清晰明了。 关于课题的设计的可行性也要综合考虑,比如前期的相关工作基础…...
Quartz入门教程
本文参考文章编写 Quartz 官网 Quartz 是 OpenSymphony 开源组织在 Job Scheduling 领域又一个开源项目,是完全由 Java 开发的一个开源任务日程管理系统,“任务进度管理器”就是一个在预先确定(被纳入日程)的时间到达时ÿ…...
TypeScript 学习之 function
函数可以实现抽象层,模拟类,信息隐藏和模块。 函数有:有名字的函数、匿名函数 在 JavaScript 中的函数 // 有名字的函数 function add(x, y) {return x y; }// 匿名函数 let myAdd function (x, y) {return x y; };函数类型 typescript 可…...
【云计算自学路线】
云计算包含的技术内容和涉及的方向比较多,一定要进行系统化的学习才能更好的掌握这门技术。 云计算作为互联网新技术领域,现阶段也是出于高速发展期,想学习加入云计算行业的小伙伴可以抓紧机会了,跟着小课一起来了解云计算以及它…...
code01 v2黑屏、花屏、死机、断电重启、休眠死机的进来
症状解决 长话简说,症状如下: 使用浏览器、播放视频等,遇到突然死机或花屏死机的情况 关闭硬件加速,如:浏览器中设置关闭硬件加速,出现这种症状的软件都需要设置 开机电流音、播放与暂停时喇叭吱吱想、打…...
分享107个HTML电子商务模板,总有一款适合您
分享107个HTML电子商务模板,总有一款适合您 107个HTML电子商务模板下载链接:https://pan.baidu.com/s/1VW67Wjso1BRpH7O3IlbZwg?pwd0d4s 提取码:0d4s Python采集代码下载链接:采集代码.zip - 蓝奏云 Aplustemplates 购物模板…...
Barra模型因子的构建及应用系列三之Momentum因子
一、摘要 在之前的Barra模型系列文章中,我们已经初步讲解、构建了Size因子和Beta因子,并分别创建了对应的单因子策略。通过回测发现,其中Size因子的小市值效应具有很强的收益能力。而本篇文章将在该系列下进一步构建Momentum因子。 二、模型…...
8.2.1.3 索引合并优化
索引合并访问方法检索具有多个范围扫描的行,并将其结果合并为一个。此访问方法仅合并来自单个表的索引扫描,而不是跨多个表的扫描。合并可以生成其基础扫描的合并、交叉或交叉的合并。 可以使用索引合并的查询示例: SELECT * FROM tbl_name…...
水雨情在线小能手-雨量水位报警站
雨量水位报警站由水位探测器、雨量传感器、报警灯、扩音器、太阳能板和采集传输控制器组成。实时采集水位等级,三个水位探测器对应3个水位等级,当现场水面浸没相应探测器时,本机会实时发出语音报警,同时可发送相应的预警/报警等级…...
【蓝桥杯集训4】双指针专题(6 / 6)
目录 3768. 字符串删减 - 滑动窗口ac 799. 最长连续不重复子序列 - 滑动窗口 800. 数组元素的目标和 - 二分ac 2816. 判断子序列 - 双指针 1238. 日志统计 - 滑动窗口 1240. 完全二叉树的权值 - 双指针 1、前缀和 - 通过了 5/12个数据 2、双指针 3768. 字符串删减 -…...
文件流,gzip解压,压缩
目录 文件画布 写入 (空文件Foutnew File(Parent,entry.getName());)FileOutputStream outnew FileOutputStream(Fout);BufferedOutputStream Boutnew BufferedOutputStream(out);其他流量基于基础包装文件--文件流---字节流 顺序pbf一般是形成后再压缩目…...
在线开会,来开开圆桌会议吧~
圆桌会议应用场景:适合内部培训、部门会议亦或是头脑风暴等较为轻松的场景,有兴趣的朋友可以联系我来测试哦~~ 上图: 图:圆桌会议应用截图 在圆桌布局之下,企业可以将每一位参会者和座位绑定,1:1模拟线下圆…...
使用营销自动化的 7 大主要优势
对于大多数企业家来说,自动化已成为在数字时代简化业务的必要条件。那么,您可以采取哪些步骤来实施营销自动化呢? 1. 社交媒体整合 拥有吸引人的社交媒体形象是成功的先决条件。您不可能完成所有社交媒体营销任务,使用自动化软件&…...
前端微信小程序开发/东莞营销网站建设优化
git 本地库推送远程库 版本冲突的解决方法参考文章: (1)git 本地库推送远程库 版本冲突的解决方法 (2)https://www.cnblogs.com/ylemzhang/p/4326572.html 备忘一下。...
用卡通人物做网站属于侵权吗/百度提交网址多久才会收录
满意答案nico402013.08.18采纳率:53% 等级:12已帮助:6620人200分是一个诱惑!-------------------------------------------------------你的问题描述有问题。回答者“tbsoo_com ”的计算这里$i-1是错误的,应该加上括…...
大连金州代做网站公众号/快速排名教程
马哲包括5大部分即唯物论,辩证法,认识论,历史唯物论,资本主义本质论。 其中辩证法又包括: 1.两大特征:(1)普遍联系(2)永恒发展。 2.三大规律:&…...
国外网站建设软件有哪些/东莞网络推广托管
在进行Linux 操作的时候,我们常常需要反选操作,下面以删除文件的场景,去示例如何在Linux 命令中使用反选操作反选操作的几种思路1.利用 grep -v 反选操作 (推荐,支持正则表达式)2.shopt -s extglob (打开extglob模式)&#…...
做母婴的网站有哪些/怎么制作网站教程步骤
六个例子彻底理解finally语句块 这篇博客主要弄清楚两个问题 1. finally块中的代码是否一定会执行 2. finally块中的代码什么时候被执行 首先开始第一个: finally块中的代码一定会被执行么? 答案是否定的,主要有以下几种情况: 1.try之前发生异常或者直接结束的情况. final…...
什么是推广员/公众号排名优化软件
Jmeter界面模式,在运行的时候会消耗较多资源,所以为了节约资源可以采用命令行模式运行Jmeter测试脚本。 一、操作步骤: 现在Jmeter上做好脚本;脚本做好后,将Jmeter关掉,windows下打开dos窗口;在…...