【矩阵】【中等】矩阵置零

发布时间:2026/10/28 15:17:05

【矩阵】【中等】矩阵置零 题目给定一个 m x n 的矩阵如果一个元素为 0 则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。示例 1输入matrix [[1,1,1],[1,0,1],[1,1,1]]输出[[1,0,1],[0,0,0],[1,0,1]]示例 2输入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]]提示m matrix.lengthn matrix[0].length1 m, n 200-2^31 matrix[i][j] 2^31 - 1进阶一个直观的解决方案是使用 O(mn) 的额外空间但这并不是一个好的解决方案。一个简单的改进方案是使用 O(m n) 的额外空间但这仍然不是最好的解决方案。你能想出一个仅使用常量空间的解决方案吗方法一复制矩阵复制一样大小和内容的矩阵copy[m][n]如果copy[i][j] 0那么就把原矩阵中的第i行、第j列置零此时的额外空间是O(mn)注意不能直接一边扫描、一边把原矩阵改成 0例如矩阵[1,1,1],[1,0,1],[1,1,1]扫描到中间的时候将行和列都设置为 0变为下面的矩阵[1,0,1],[0,0,0],[1,0,1]这是时候后续扫描到第三行第二列的时候数值也为 0但是它是刚才置零产生不是原有的 0publicstaticvoidsetZeroes(int[][]matrix){//int[][] copy matrix.clone();浅拷贝修改 matrix 会影响 copyint[][]copynewint[matrix.length][matrix[0].length];for(inti0;imatrix.length;i){copy[i]matrix[i].clone();// 或者 Arrays.copyOf(matrix[i], matrix[i].length)}for(inti0;imatrix.length;i){for(intj0;jmatrix[i].length;j){if(copy[i][j]0){//将第i行和第j列设置为0for(intk0;kmatrix.length;k){matrix[k][j]0;}for(intk0;kmatrix[i].length;k){matrix[i][k]0;}}}}}时间复杂度O(mn(mn))空间复杂度O(mn)方法二记录行和列的清零位置根本没必要保存完整矩阵。因为对于每个 0真正需要记住的信息只有第几行要清零和第几列要清零第一遍扫描记录需要清零的行 rows[] 和列 cols[]第二遍扫描如果属于标记的行/列则清零publicstaticvoidsetZeroes(int[][]matrix){boolean[]rownewboolean[matrix.length];boolean[]colnewboolean[matrix[0].length];for(inti0;imatrix.length;i){for(intj0;jmatrix[0].length;j){if(matrix[i][j]0){row[i]true;col[j]true;}}}for(inti0;imatrix.length;i){for(intj0;jmatrix[0].length;j){if(row[i]||col[j]){matrix[i][j]0;}}}}时间复杂度O(mn)空间复杂度O(mn)方法三第一行和第一列充当标记数组矩阵本身已经有第一行和第一列因此可以替代上面的标记位置。注意需要首先记录原始的第一行第一列中是否有0比如对于下面的矩阵检测到 arr[0][1] 处为0则设置matrix[i][0] 0、 matrix[0][j] 0会污染原来的行列因此第一行第一列只能记录内层是否为0原有的0则需要处理完最后再单独处理[1,0,3][4,5,6][7,8,9]publicstaticvoidsetZeroesO1(int[][]matrix){booleanfirstRowZerofalse;booleanfirstColZerofalse;//需要首先记录原始的第一行第一列中是否有0for(inti0;imatrix.length;i){if(matrix[i][0]0){firstColZerotrue;}}for(intj0;jmatrix[0].length;j){if(matrix[0][j]0){firstRowZerotrue;}}//内部0的处理for(inti1;imatrix.length;i){for(intj1;jmatrix[i].length;j){if(matrix[i][j]0){matrix[i][0]0;matrix[0][j]0;}}}for(inti1;imatrix.length;i){for(intj1;jmatrix[i].length;j){if(matrix[i][0]0||matrix[0][j]0){matrix[i][j]0;}}}//对第一行和第一列进行处理if(firstRowZero){for(intj0;jmatrix[0].length;j){matrix[0][j]0;}}if(firstColZero){for(inti0;imatrix.length;i){matrix[i][0]0;}}}时间复杂度O(mn)空间复杂度O(1)
延伸阅读

更多相关文章

2026/10/25 11:22:46

SAP UI5 里有没有 RxJS mergeMap 的等价物,从事件机制、Promise 并发到 OData V4 批处理的完整对照

在一个典型的 SAP Fiori 页面里,表格已经拿到一批业务对象,页面随后需要针对每个对象继续读取明细、执行校验、触发一个独立的 OData 操作,或者把多个异步结果陆续写回页面状态。熟悉 RxJS 的开发者看到这种需求,很自然会想到 mergeMap。问题也就落到了一个非常具体的位置,…

2026/10/26 8:37:46

免终端:用Platypus三步把脚本打包成macOS应用

免终端:用Platypus三步把脚本打包成macOS应用 【免费下载链接】Platypus Create native macOS applications from command line scripts. 项目地址: https://gitcode.com/gh_mirrors/pl/Platypus 你写完了一个处理文件的脚本,但需要用它的同事从没…

2026/10/27 22:18:09

大模型降智是错觉还是事实,多维度对比告诉你答案

是模型变笨了,还是我们的感觉出了错? 最近社区里关于“大模型降智”的讨论热度居高不下。很多开发者都有类似的体感:明明上周还能完美解决的复杂逻辑题,这周再问却得到了一个敷衍甚至错误的回答。这种落差感让人不禁怀疑&#xf…

2026/10/28 15:16:47

Claude模型本地会话记忆管理技术解析

我无法根据当前输入生成符合要求的博文。原因如下:项目标题为"claude-mem",但该项目正文、关键词、摘要描述全部为空;所谓“相关热搜词”和“最新网络热词”仅重复了标题本身("claude-mem")&#…

2026/10/28 15:16:47

Claude内存优化技术解析与本地部署实践

我无法根据当前输入生成符合要求的博文内容。原因如下:输入中仅提供了项目标题"claude-mem",以及一个空的网络搜索内容块(),未提供任何实质性描述、场景说明、关键词列表或摘要描述;根据任务定义…

2026/10/28 15:16:47

C#调HALCON读GigE相机:HSmartWindowControl缩放平移

简介:C# 调用 Halcon 读取海康相机并在 HSmartWindow 上完成平移缩放的完整示例工程,面向已具备 C# 基础、正在做工业视觉上位机开发的初、中级工程师。工程演示了 HalconDotNet 引用的引入方式、相机设备的打开与图像异步采集、HObject 图像在显示控件上…

2026/10/28 15:16:47

企业邮箱邮件撤回全解析:机制、操作与失败补救指南

企业邮箱的邮件撤回功能,说起来简单,真到用的时候十个人里有八个会踩坑。我见过太多同事在群里急得跳脚——“刚发出去的报价单附件错了”“把内部讨论误发给了客户”“邮件里写错了领导名字”,然后第一反应就是问:能不能撤回来&a…

2026/10/28 15:16:47

跨境电商新手避坑指南:识别伪蓝海与选品验证流程

1. 半年白干之后,我才看懂“伪蓝海”长什么样去年秋天我关掉最后一个店铺后台的时候,账上还剩不到四千块,仓库里压着两百多件卖不动的货,信用卡账单分了十二期。那半年我每天凌晨两点还在盯数据,选品表格改了三十多版&…

2026/10/28 15:11:47

Wan2.2视频生成模型技术解析与本地部署指南

1. Wan2.2视频生成模型技术解析Wan2.2作为当前开源社区最受关注的大规模视频生成模型,其技术架构采用了Diffusion Models的改进版本。与传统的Stable Diffusion等图像生成模型不同,Wan2.2通过时空注意力机制(Spatio-Temporal Attention&#…

2026/10/28 14:42:12

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/27 9:34:54

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/28 0:02:13

Python股票自动交易系统源码解析:从行情获取到风控的完整链路

简介:这份资源是面向高校计算机、金融相关专业毕业设计场景的完整项目源码包,主题为基于Python的股票自动交易系统,适合需要完成毕设选题、课程设计或自学金融量化交易开发的学生与开发者参考。压缩包共收录687个文件,整体约14.93…

2026/10/28 0:02:13

视酷酷信IM源码部署指南:Java 17+MySQL 8.0.33实战配置

简介:这是一套2024年亲测可部署的视酷酷信IM即时通讯系统源码,面向具备Java、OC、C#及Vue开发能力的技术人员,解决私有化即时通讯平台快速搭建与二次定制需求,尤其适用于需集成商城、保障数据主权的中小型企业或独立开发者。资源共…

2026/10/28 0:02:13

Python爬取百度迁徙数据:接口解析、批量采集与避坑指南

简介:这份资源是一个用Python爬取百度迁徙数据的脚本压缩包,面向具备Python基础、希望入门网络爬虫与数据解析的开发者,解决按日期获取全国热门城市人口迁徙数据的问题。包内共1个文件,为单个py脚本,压缩包约1KB&#…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑