矩阵置零算法:原地操作与空间复杂度优化

发布时间:2026/10/31 4:28:25

矩阵置零算法:原地操作与空间复杂度优化 1. 矩阵置零问题解析今天要聊的是一个在算法面试中经常出现的经典题目——矩阵置零LeetCode第73题。这个问题看似简单但想要写出最优解却需要一些巧妙的思考。我第一次遇到这个问题时也是花了些时间才理解其中的精妙之处。题目要求很简单给定一个m×n的矩阵如果某个元素为0就将其所在行和列的所有元素都设为0。要求必须在原矩阵上直接修改不能使用额外的空间。这种原地修改的要求正是这个问题的挑战所在。2. 问题分析与初步解法2.1 直观解法及其局限性最直观的解法是使用两个标记数组一个记录哪些行需要置零另一个记录哪些列需要置零。具体步骤如下遍历整个矩阵记录下所有0元素所在的行和列再次遍历矩阵将标记过的行和列上的所有元素置为0这种方法的时间复杂度是O(m×n)空间复杂度是O(mn)。虽然时间复杂度已经是最优了但空间复杂度还可以进一步优化。def setZeroes(matrix): m, n len(matrix), len(matrix[0]) rows, cols set(), set() # 第一次遍历记录0的位置 for i in range(m): for j in range(n): if matrix[i][j] 0: rows.add(i) cols.add(j) # 第二次遍历置零 for i in range(m): for j in range(n): if i in rows or j in cols: matrix[i][j] 02.2 空间复杂度优化思路为了达到O(1)的空间复杂度我们需要利用矩阵本身来存储标记信息。具体思路是使用矩阵的第一行和第一列来记录哪些行和列需要置零需要额外两个变量记录第一行和第一列本身是否需要置零这种方法巧妙地将标记信息存储在矩阵内部避免了使用额外空间。3. 最优解法实现3.1 标记策略详解最优解法的关键在于如何利用矩阵本身的空间来存储标记信息。具体步骤如下检查第一行和第一列是否有0用两个布尔变量记录遍历矩阵的其他部分如果发现0就在对应的第一行和第一列的位置标记为0根据第一行和第一列的标记将对应的行和列置零最后根据最初的布尔变量决定是否将第一行和第一列置零def setZeroes(matrix): m, n len(matrix), len(matrix[0]) first_row_has_zero any(matrix[0][j] 0 for j in range(n)) first_col_has_zero any(matrix[i][0] 0 for i in range(m)) # 使用第一行和第一列作为标记空间 for i in range(1, m): for j in range(1, n): if matrix[i][j] 0: matrix[i][0] 0 matrix[0][j] 0 # 根据标记置零 for i in range(1, m): for j in range(1, n): if matrix[i][0] 0 or matrix[0][j] 0: matrix[i][j] 0 # 处理第一行和第一列 if first_row_has_zero: for j in range(n): matrix[0][j] 0 if first_col_has_zero: for i in range(m): matrix[i][0] 03.2 边界条件处理这个解法中最容易出错的地方是对第一行和第一列的处理。必须注意要先检查第一行和第一列本身是否有0并用单独的变量记录标记阶段不能修改第一行和第一列的值除了作为标记最后才根据初始记录决定是否置零第一行和第一列4. 复杂度分析与变种问题4.1 时间复杂度与空间复杂度最优解法的时间复杂度是O(m×n)因为需要遍历矩阵两次标记阶段和置零阶段。空间复杂度是O(1)只使用了常数个额外变量。4.2 相关变种问题这个问题的变种包括如果允许使用O(mn)空间但不允许使用集合数据结构如何实现如果要求只遍历矩阵一次如何实现如果矩阵非常大无法完全装入内存如何分块处理5. 实际应用场景矩阵置零算法在实际中有多种应用场景图像处理中可能需要将某些特定颜色值视为0所在的行列全部设为黑色电子表格处理中可能需要清除某些错误值所在的行列游戏开发中可能需要重置某些特殊方块所在的行列6. 常见错误与调试技巧在实现这个算法时容易犯的错误包括忘记处理第一行和第一列的特殊情况在标记阶段错误地修改了第一行或第一列的值置零阶段没有正确处理标记调试时可以打印出每次循环后的矩阵状态使用小矩阵如2×2或3×3进行测试特别注意边界条件全0矩阵、第一行有0、第一列有0等情况7. 算法优化思考虽然这个解法已经相当高效但还可以思考能否进一步减少遍历次数对于稀疏矩阵大部分元素为0是否有更优的解法如何并行化这个算法以利用多核处理器在实际面试中面试官可能会要求你逐步优化解法从最直观的方法开始一步步引导到最优解。这种展示问题解决能力的过程往往比直接写出最优解更重要。
延伸阅读

更多相关文章

2026/10/31 4:28:25

MySQL数据库核心特性与高效实践指南

1. MySQL基础概念与核心特性MySQL作为全球最流行的开源关系型数据库管理系统,自1995年由瑞典MySQL AB公司开发以来,凭借其高性能、高可靠性和易用性,已成为Web应用开发的标准配置。当前最新稳定版本为8.0系列,较早期版本在性能优化…

2026/10/31 4:28:25

机器学习作业复习指南:从知识地图到查漏补缺的完整路径

简介:这份资源面向正在学习或复习吴恩达机器学习课程的学习者,尤其适合需要对照编程作业动手实践、又希望有中文笔记辅助理解的同学。包内包含课后编程作业的无答案版与有答案版(有答案版又细分三版),并附作业题目合并…

2026/10/31 4:28:25

机器学习作业复习指南:知识地图与查漏补缺全流程

简介:这份资源面向正在学习吴恩达机器学习课程的自学者与在校学生,围绕课后编程作业提供了一套较为完整的配套材料,帮助读者在缺少官方答案的情况下对照练习、核对思路并整理复习。压缩包共收录1028个文件,约202.33MB,…

2026/10/31 5:43:29

哈希表与双指针解决四数之和问题

1. 四数之和问题概述哈希表作为解决多数和问题的经典数据结构,在四数之和这类题目中展现出独特的优势。这道题目要求我们在给定的整数数组中找到所有不重复的四元组,使得它们的和等于目标值。与两数之和、三数之和相比,四数之和在时间复杂度控…

2026/10/31 5:43:29

EBI架构:Entity-Business-Interface三层解耦设计范式

1. 什么是EBI架构:从“数据烟囱”到统一业务中枢的必然选择EBI架构——这个在近年技术复盘类文章中高频出现的术语,不是某个新发布的开源框架,也不是某家大厂刚注册的商标,而是一套在真实业务压力下反复锤炼、逐步沉淀下来的系统性…

2026/10/31 5:43:29

非递归全排列算法原理与工程实践指南

简介:本资源提供一种高效、稳定的N个数全排列非递归实现方案,面向算法学习者、C初学者及编程竞赛备赛人员,解决递归易致栈溢出、调试困难等实际痛点。代码采用纯迭代逻辑,通过元素交换与状态追踪完成全排列生成,兼顾可…

2026/10/31 5:43:29

26主课20笔记:高效学习与知识管理方法论

1. 项目背景与核心价值"26面主课 20笔记"这个标题看似简单,却蕴含着高效学习与知识管理的深层逻辑。作为一名经历过数百小时课程学习与知识整理的老手,我深刻理解系统化学习的重要性。这个数字组合实际上代表了一种经过验证的学习方法论&#…

2026/10/31 5:43:29

MySQL意向锁原理与应用场景解析

1. 意向锁的本质与存在意义数据库系统中存在一个经典矛盾:当多个事务同时操作同一张表的不同行时,如何高效判断是否存在冲突?想象一下图书馆的场景——如果没有书架管理员提前标记某排书架正在整理(即使只动其中一本书&#xff09…

2026/10/31 5:38:28

U盘格式怎么选?FAT32、exFAT、NTFS实战决策指南

1. 为什么U盘格式不是“选个最快的就行”——从一次文件丢失说起去年帮某高校实验室整理一批野外采集的传感器数据,几十GB的原始日志文件要拷进U盘带回办公室分析。当时随手选了Windows默认的NTFS格式,插进一台老款Linux教学机——结果连识别都失败&…

2026/10/30 20:55:10

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

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

2026/10/30 20:55:10

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

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

2026/10/30 20:55:09

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

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

2026/10/31 0:02:41

猫狗目标检测数据集:VOC/COCO/YOLO三格式一体化实战包

简介:本资源是一套面向计算机视觉初学者与YOLO目标检测实践者的猫狗图像数据集及配套开发工具包,专为快速上手目标检测模型训练而设计。资源包含1000张真实场景高清猫狗图片,标注质量高,同时提供VOC(XML)、…

2026/10/31 0:02:41

HDU2017多校标程复现:算法竞赛工程化真题沙盒

简介:本资源为2017年HDU多校联合训练第一场官方配套资料,面向ACM程序设计竞赛备赛学生、算法爱好者及高校编程集训队成员,旨在提供权威解题参考与完整测试验证环境。压缩包共40个文件,含15份C标程(覆盖全部赛题&#x…

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

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

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