给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
// leetcode:https://leetcode.cn/problems/set-matrix-zeroes/description/
package main
import (
"fmt"
"reflect"
)
func setZeroes(matrix [][]int) {
if len(matrix) == 0 {
return
}
row := len(matrix)
col := len(matrix[0])
// 用 matrix[0] 保存相应的列是否有 0,比如 matrix[0][j] == 0 表示第 j 列有 0。
// 因此,matrix[0][i] 可能本身不为 0,但被修改为 0。所以提前遍历 matrix[0] 获取该行是否存在 0
row0Has0 := false
for j := 0; j < col; j++ {
if matrix[0][j] == 0 {
row0Has0 = true
}
}
// 从第一行开始处理
for i := 1; i < row; i++ {
has0 := false
for j := 0; j < col; j++ {
if matrix[i][j] == 0 {
has0 = true
// 处理为 0 的列
matrix[0][j] = 0
}
}
if has0 {
for j := 0; j < col; j++ {
matrix[i][j] = 0
}
}
}
// 根据 matrix[0] 处理每一列
for j := 0; j < col; j++ {
if matrix[0][j] == 0 {
for i := 1; i < row; i++ {
matrix[i][j] = 0
}
}
}
// 处理 matrix[0]
if row0Has0 {
for j := 0; j < col; j++ {
matrix[0][j] = 0
}
}
}
func main() {
tests := []struct {
matrix [][]int
expected [][]int
}{
{
[][]int{
{1, 1, 1},
{1, 0, 1},
{1, 1, 1},
},
[][]int{
{1, 0, 1},
{0, 0, 0},
{1, 0, 1},
},
},
{
[][]int{
{0, 1, 2, 0},
{3, 4, 5, 2},
{1, 3, 1, 5},
},
[][]int{
{0, 0, 0, 0},
{0, 4, 5, 0},
{0, 3, 1, 0},
},
},
}
for _, test := range tests {
setZeroes(test.matrix)
if !reflect.DeepEqual(test.matrix, test.expected) {
panic(fmt.Sprintf("got %v, but %v expected", test.matrix, test.expected))
}
}
}