1. 矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。


2. Go 实现

// 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))
        }
    }
}