一天一道算法题(9):空间优化从O(mn)到O(1)的思路与实现解析
矩阵置零LeetCode 73题三种解法详解文章目录矩阵置零LeetCode 73题三种解法详解题目描述思路分析难点所在解法一O(mn) 空间最直观解法二O(mn) 空间改进解法三O(1) 空间最优解总结对比题目描述给定一个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]]思路分析难点所在在遍历矩阵的过程中如果将遇到的0所在行和列直接变为0那么后续遍历时我们无法分辨某个位置的0是原本就有的还是被我们修改出来的。这会导致错误传播将原本不该清零的位置也清零了。解法一O(mn) 空间最直观最直接的想法是复制一个完全相同的矩阵然后遍历原矩阵遇到0就在复制的矩阵中清空对应的行和列。这样我们始终基于原始状态进行操作避免了错误传播。funcsetZeroes(matrix[][]int){// 复制矩阵temp:make([][]int,len(matrix))fori:0;ilen(matrix);i{temp[i]append([]int(nil),matrix[i]...)}// 遍历复制的矩阵在原矩阵上修改fori:0;ilen(temp);i{forj:0;jlen(temp[i]);j{iftemp[i][j]0{// 清空当前行clear(matrix[i])// 清空当前列fork:0;klen(matrix);k{matrix[k][j]0}}}}}复杂度分析时间复杂度O(mn)需要遍历矩阵两次空间复杂度O(mn)复制了一个完整的矩阵这种方法虽然直观但不符合题目对原地算法的要求。解法二O(mn) 空间改进仔细观察我们其实不需要复制整个矩阵。只需要记录哪些行和哪些列需要清零即可。用两个布尔数组分别标记row[i] true表示第 i 行需要清零col[j] true表示第 j 列需要清零funcsetZeroes(matrix[][]int){// 行标记数组row:make([]bool,len(matrix))// 列标记数组col:make([]bool,len(matrix[0]))// 第一次遍历标记需要清零的行和列fori:0;ilen(matrix);i{forj:0;jlen(matrix[0]);j{ifmatrix[i][j]0{row[i]truecol[j]true}}}// 第二次遍历根据标记清零fori:0;ilen(matrix);i{forj:0;jlen(matrix[0]);j{ifrow[i]||col[j]{matrix[i][j]0}}}}复杂度分析时间复杂度O(mn)空间复杂度O(mn)这种方法比解法一好很多但仍然不是最优解。解法三O(1) 空间最优解能否只使用常量空间答案是肯定的核心思想利用矩阵的第一行和第一列作为标记数组。用matrix[0][j]标记第 j 列是否需要清零用matrix[i][0]标记第 i 行是否需要清零但这里有个问题matrix[0][0]既属于第一行又属于第一列会产生冲突。解决方案是用两个独立变量row1和col1分别记录第一行和第一列本身是否包含 0。funcsetZeroes(matrix[][]int){// 用两个变量记录第一行、第一列是否存在 0row1,col1:1,1// 检查第一行是否有 0forj:0;jlen(matrix[0]);j{ifmatrix[0][j]0{row10break}}// 检查第一列是否有 0fori:0;ilen(matrix);i{ifmatrix[i][0]0{col10break}}// 遍历除第一行第一列外的所有元素fori:1;ilen(matrix);i{forj:1;jlen(matrix[0]);j{ifmatrix[i][j]0{// 用第一行标记列matrix[0][j]0// 用第一列标记行matrix[i][0]0}}}// 根据标记清零除第一行第一列外fori:1;ilen(matrix);i{forj:1;jlen(matrix[0]);j{ifmatrix[i][0]0||matrix[0][j]0{matrix[i][j]0}}}// 最后处理第一行ifrow10{forj:0;jlen(matrix[0]);j{matrix[0][j]0}}// 最后处理第一列ifcol10{fori:0;ilen(matrix);i{matrix[i][0]0}}}复杂度分析时间复杂度O(mn)空间复杂度O(1)注意事项必须先处理除第一行第一列外的元素最后再处理第一行和第一列如果一开始就清零第一行或第一列会破坏标记信息总结对比解法空间复杂度特点复制矩阵O(mn)最直观但不符合题目要求标记数组O(mn)简单改进但非最优第一行第一列标记O(1)最优解面试首选这道题的核心在于如何用有限的额外空间记录行和列的清零信息。从 O(mn) 到 O(mn) 再到 O(1)每一步优化都体现了空间换时间的思想转变值得细细品味。

相关新闻

Qwen-Image-Lightning深度解析:4步极速AI图像生成实战指南

Qwen-Image-Lightning深度解析:4步极速AI图像生成实战指南

Qwen-Image-Lightning深度解析:4步极速AI图像生成实战指南 【免费下载链接】Qwen-Image-Lightning 项目地址: https://ai.gitcode.com/hf_mirrors/lightx2v/Qwen-Image-Lightning Qwen-Image-Lightning是基于Qwen-Image模型的轻量化极速版本,通过…

2026/9/21 1:43:57 阅读更多 →
refcard-org-mode核心功能详解:让你的文档编辑效率翻倍

refcard-org-mode核心功能详解:让你的文档编辑效率翻倍

refcard-org-mode核心功能详解:让你的文档编辑效率翻倍 【免费下载链接】refcard-org-mode Get organized and boost your productivity with our comprehensive Org mode syntax reference card! Get a quick access to helpful tips and tricks. #orgmode #syntax…

2026/9/30 7:19:31 阅读更多 →
大麦网抢票脚本逆向工程:从零构建自动化购票系统的完整指南

大麦网抢票脚本逆向工程:从零构建自动化购票系统的完整指南

大麦网抢票脚本逆向工程:从零构建自动化购票系统的完整指南 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 你是否曾因热门演唱会门票秒光而苦恼?是否…

2026/9/29 6:05:31 阅读更多 →

最新新闻

HiKid架构拆解:electron-vite三进程模型构建跨平台桌面应用完整实践

HiKid架构拆解:electron-vite三进程模型构建跨平台桌面应用完整实践

【免费下载链接】hi-kid HiKid - Your AI English Pal. A desktop app built with React and TypeScript, targeting children in non-English-speaking countries who want to practice English speaking and listening. 项目地址: https://gitcode.com/gh_mirrors…

2026/10/14 15:18:12 阅读更多 →
CubeSandbox:企业级安全工作流的可信执行底座

CubeSandbox:企业级安全工作流的可信执行底座

1. 项目概述:为什么企业安全执行面需要 CubeSandbox 这个“保险箱”最近在给三家制造业客户做安全架构复盘时,反复被问到一个问题:“我们部署了 OpenClaw 做自动化响应,也装了 DSH(Defense Shell)做终端策略…

2026/10/14 15:18:12 阅读更多 →
Go语言内存优化利器:betteralign工具实战指南

Go语言内存优化利器:betteralign工具实战指南

1. 项目概述:betteralign 工具的核心价值betteralign 是一个专门为 Go 语言开发者设计的内存优化工具,它通过智能分析结构体字段排列顺序,可以显著减少内存占用。在实际测试中,这个工具能让典型结构体的内存消耗降低 30-50%&#…

2026/10/14 15:18:12 阅读更多 →
Codex 半年使用总结:省 Token 技巧与计划模式实战

Codex 半年使用总结:省 Token 技巧与计划模式实战

1. 半年迭代里,Codex 到底变了哪些东西从去年底开始把 Codex 当作日常主力编码助手用到现在,差不多半年时间。这半年里它的更新节奏不算快,但每一次改动都挺有针对性,尤其是围绕 Token 消耗和交互模式这两块,变化比我一…

2026/10/14 15:18:12 阅读更多 →
astropy WCS 修复:备选 WCS(key=‘A‘/‘B‘)畸变关键字按后缀独立读取的完整解析

astropy WCS 修复:备选 WCS(key=‘A‘/‘B‘)畸变关键字按后缀独立读取的完整解析

科学计算科研数据分析 【免费下载链接】astropy Astronomy and astrophysics core library 项目地址: https://gitcode.com/gh_mirrors/as/astropy 点击查看 免费下载 导读 本文围绕 astropy 仓库中的修复条目 19228.bugfix.rst 展开:当一张 FITS 图像…

2026/10/14 15:18:12 阅读更多 →
2026年最新--区块链运营岗面试题库(100题)

2026年最新--区块链运营岗面试题库(100题)

一、行业趋势与运营思维(1-10题) 1. 2026年加密行业营销的核心趋势有哪些?请结合“用户质量优先”的转变,说明运营策略应如何调整。 2026年加密营销的7大核心趋势涵盖绩效营销、内容创作、渠道多元化、活动体验、激励机制以及AI驱动的运营。最关键的转变是:Fintech和Web…

2026/10/14 15:17:11 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →