news 2026/6/24 9:01:40

LeetCode 73. 矩阵置零,从标记数组到 O(1) 空间优化彻底讲透

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 73. 矩阵置零,从标记数组到 O(1) 空间优化彻底讲透

LeetCode 73. 矩阵置零,从标记数组到 O(1) 空间优化彻底讲透

一、题目描述

给定一个 m × n 的矩阵,如果一个元素为 0,则将其所在行和所在列的所有元素都设为 0。

要求:

  • 原地修改矩阵
  • 尽量减少额外空间使用

示例:

输入:[[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]

二、最容易想到的错误做法

很多人第一次做这题都会这样写:

foriinrange(m):forjinrange(n):ifmatrix[i][j]==0:将该行该列全部置零

这种写法是错误的。

原因在于:

当你把某行某列置零后,新产生的 0 又会被后续遍历当作原始 0 继续扩散。

例如:

111101111

处理中间的 0 后:

101000101

此时新增的多个 0 如果继续参与判断,就会导致整个矩阵最终全部变成 0。

因此:

必须先记录哪些行列需要置零,再统一修改。


三、解法一:标记数组法

核心思想

分别记录:

  • 哪些行需要置零
  • 哪些列需要置零

遍历结束后统一处理。


第一步:创建标记数组

rows=[False]*m cols=[False]*n

例如:

111101111

发现:

matrix[1][1]==0

则:

rows[1]=Truecols[1]=True

表示:

  • 第 1 行要清零
  • 第 1 列要清零

第二步:统一置零

再次遍历矩阵:

ifrows[i]orcols[j]:matrix[i][j]=0

完整代码

classSolution:defsetZeroes(self,matrix):m=len(matrix)n=len(matrix[0])rows=[False]*m cols=[False]*nforiinrange(m):forjinrange(n):ifmatrix[i][j]==0:rows[i]=Truecols[j]=Trueforiinrange(m):forjinrange(n):ifrows[i]orcols[j]:matrix[i][j]=0

复杂度分析

时间复杂度:

O(m*n)

空间复杂度:

O(m+n)

四、进阶要求:O(1) 空间怎么办?

面试官经常追问:

不允许额外使用两个数组怎么办?

这里就要用到经典技巧:

复用第一行和第一列作为标记数组。


五、原地标记法

思路

利用:

matrix[i][0]

记录第 i 行是否需要清零

利用:

matrix[0][j]

记录第 j 列是否需要清零

这样就不用额外开空间。


需要额外解决的问题

第一行和第一列本身也可能有 0。

所以要提前记录:

row0

首行是否有 0

col0

首列是否有 0


六、固定四步流程

第一步:记录首行首列状态

row0=any(matrix[0][j]==0forjinrange(n))col0=any(matrix[i][0]==0foriinrange(m))

第二步:利用首行首列打标记

foriinrange(1,m):forjinrange(1,n):ifmatrix[i][j]==0:matrix[i][0]=0matrix[0][j]=0

第三步:处理中间区域

foriinrange(1,m):forjinrange(1,n):ifmatrix[i][0]==0ormatrix[0][j]==0:matrix[i][j]=0

第四步:处理首行首列

ifrow0:首行全部置零ifcol0:首列全部置零

七、高频易错点

错误1:边遍历边置零

会导致新增 0 被重复扩散。


错误2:没先保存首行首列状态

首行首列后续要充当标记区。

如果提前被覆盖,原始信息就丢失了。


错误3:忘记最后处理首行首列

这是 O(1) 解法最常见 Bug。


八、一句话总结

矩阵置零的核心不是如何置零,而是如何保存原始的零信息。

普通做法使用两个标记数组记录行列状态,进阶做法则直接复用第一行和第一列作为标记区,将空间复杂度优化到 O(1)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/24 8:55:46

AI生成歌曲后还能继续编辑的软件有哪些

很多人想用AI写歌,却常遇到两个现实问题:要么生成的中文歌咬字生硬、情绪不对,要么生成后只能导出成品,没法改人声、调混音,想微调都不行。还有不少普通用户和短视频博主,希望从一句灵感开始,做…

作者头像 李华
网站建设 2026/6/24 8:51:23

从Demo到生产:用LangSmith+DeepEval打通Agent评估最后一公里

LangSmith LangSmith 为LLM 应用提供了完整的工具链,包括: 调试与追踪: 实时追踪每个 LLM 调用、工具使用和 Agent 决策过程,帮助快速定位问题。性能监控: 监控响应时间、Token 使用量、成本等关键指标,优…

作者头像 李华
网站建设 2026/6/24 8:46:52

目前靠谱的灯芯铁托公司哪家好

最近半个月收到30多条做蜡烛品类的商家私信,吐槽找灯芯铁托供应商踩的坑:要么铁托卡槽太松卡不住棉线,烧10分钟灯芯就歪倒熄灭,客诉率直接飙到18%;要么找的是三四手中间商,拿货价比源头厂贵30%不说&#xf…

作者头像 李华
网站建设 2026/6/24 8:42:34

能源转型背景下风光储充技术解析

在当今能源转型的大背景下,风光储充技术成为了推动可持续能源发展的关键力量。风光储充系统能够将风能、太阳能等可再生能源进行高效存储和合理分配,有效解决了新能源发电的间歇性和不稳定性问题,对于构建清洁、低碳、安全、高效的能源体系具…

作者头像 李华
网站建设 2026/6/24 8:39:20

Atmel CryptoAuthentication评估套件实战:从硬件加密到安全协议集成

1. 项目概述:从硬件加密狗到安全评估平台如果你正在接触嵌入式安全、物联网设备认证或者硬件加密相关的项目,那么Atmel(现为Microchip Technology的一部分)的CryptoAuthentication系列芯片很可能已经进入了你的视野。这些芯片的核…

作者头像 李华