5-数组-矩阵置零

这是数组的第5篇算法,力扣链接

给定一个 mxn 的矩阵,如果一个元素为 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]]

看到这道题的第一反应就是打表,两次遍历,一次记录清零的行列,最后再遍历清零。

Go 复制代码
func setZeroes(matrix [][]int) {
	rows, cols := make([]bool, len(matrix)), make([]bool, len(matrix[0]))
	for ri, row := range matrix {
		for ci, col := range row {
			if col == 0 {
				rows[ri] = true
				cols[ci] = true
			}
		}
	}
	for ri, row := range matrix {
		for ci, _ := range row {
			if rows[ri] || cols[ci] {
				matrix[ri][ci] = 0
			}
		}
	}
}

这里有多种解法,核心逻辑都差不多,只不过标记的方法不同。

这里延伸出一种特殊的标注逻辑,我们将每一行/列的信息同步到第一行/列中,这样就不会额外占用空间了。值得注意的是,第一列是否需要清零需要额外标注。

Go 复制代码
func setZeroes(matrix [][]int) {
	col0 := false
	for _, row := range matrix {
		if row[0] == 0 {
			col0 = true
		}
		for j := 1; j < len(matrix[0]); j++ {
			if row[j] == 0 {
				row[0] = 0
				matrix[0][j] = 0
			}
		}
	}
	for i := len(matrix) - 1; i >= 0; i-- {
		for j := 1; j < len(matrix[0]); j++ {
			if matrix[i][0] == 0 || matrix[0][j] == 0 {
				matrix[i][j] = 0
			}
		}
		if col0 {
			matrix[i][0] = 0
		}
	}
}
相关推荐
爱跳舞的烤冷面几秒前
自学嵌入式第19天(数据结构篇——栈)
数据结构
乐观勇敢坚强的老彭23 分钟前
C++ STL 常用容器的速查表
java·c++·算法
北冥you鱼25 分钟前
深入解析 Go 中 sync.YAML.Unmarshal:如何将 YAML 数据填充到 Config 结构体
开发语言·算法·golang
星轨初途1 小时前
LeetCode 热题 100——day11 滑动窗口最大值
数据结构·c++·算法·leetcode·职场和发展
gbase_lmax2 小时前
深度递归与广度递归(DFS,BFS)实现
算法·深度优先·宽度优先
西柚研究生1234563 小时前
论文分析15:跨层特征交互的多尺度无人机小目标检测算法
人工智能·算法·目标检测
rannn_11110 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
数模竞赛Paid answer10 小时前
2026年华东杯数学建模B题医药物流安排问题解题全过程文档及程序
算法·数学建模·数据分析·华东杯
不会代码的小猴11 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
AI备案指南-满满11 小时前
大模型与算法备案全流程详解:从零到通过的完整指南
人工智能·算法·备案·大模型备案·算法备案