essay
hot100-矩阵置零
#算法
hot100——矩阵置零
给定一个 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]]
提示:
-
m == matrix.length
-
n == matrix[0].length
-
1 <= m, n <= 200
-
- <= matrix[i][j] <= - 1
使用了O(m+n)的额外空间,并非最优解
解法
func setZeroes(matrix [][]int) {
m, n := len(matrix), len(matrix[0]) // 获取矩阵的行数 m 和列数 n
rowZero := make([]bool, m) // rowZero[i] 表示第 i 行是否应该被置为 0
colZero := make([]bool, n) // colZero[j] 表示第 j 列是否应该被置为 0
// 第一遍遍历:标记所有需要清零的行和列
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if matrix[i][j] == 0 { // 当前位置为 0,那么第 i 行和第 j 列最终都要变为 0
rowZero[i] = true
colZero[j] = true
}
}
}
// 第二遍遍历:根据之前标记的行和列,将对应位置置为 0
for i := 0; i < m; i++ {
for j := 0; j < n; j++ { // 如果当前行被标记需要清零,或者当前列被标记需要清零
if rowZero[i] || colZero[j] {
matrix[i][j] = 0
}
}
}
}