ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

5-数组-矩阵置零

2026/9/12 14:55:33 拓冰建站 浏览量
5-数组-矩阵置零

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

给定一个 m x n 的矩阵,如果一个元素为 ,则将其所在行和列的所有元素都设为 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]]

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

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] = truecols[ci] = true}}}for ri, row := range matrix {for ci, _ := range row {if rows[ri] || cols[ci] {matrix[ri][ci] = 0}}}
}

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

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

func setZeroes(matrix [][]int) {col0 := falsefor _, row := range matrix {if row[0] == 0 {col0 = true}for j := 1; j < len(matrix[0]); j++ {if row[j] == 0 {row[0] = 0matrix[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}}
}