【LeetCode 热题100】73:矩阵置零(详细解析)(Go语言版)

🚀 力扣热题 73:矩阵置零(详解 + 多种解法)

📌 题目描述

给定一个 m x n 的整数矩阵 matrix,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请你 原地 使用常量空间解决。


🎯 示例

输入:

复制代码
matrix = [
  [1, 1, 1],
  [1, 0, 1],
  [1, 1, 1]
]

输出:

复制代码
[
  [1, 0, 1],
  [0, 0, 0],
  [1, 0, 1]
]

💡 解题思路一:额外标记数组

🔍 思路

  • 创建两个额外的数组 row[]col[] 分别标记哪些行和哪些列需要被置为 0;
  • 遍历一遍矩阵,标记所有包含 0 的行和列;
  • 再次遍历矩阵,根据标记将对应的行和列设为 0。

✅ Go 实现

go 复制代码
func setZeroes(matrix [][]int) {
    m, n := len(matrix), len(matrix[0])
    row := make([]bool, m)
    col := make([]bool, n)

    for i := 0; i < m; i++ {
        for j := 0; j < n; j++ {
            if matrix[i][j] == 0 {
                row[i] = true
                col[j] = true
            }
        }
    }

    for i := 0; i < m; i++ {
        for j := 0; j < n; j++ {
            if row[i] || col[j] {
                matrix[i][j] = 0
            }
        }
    }
}

📊 复杂度分析

时间复杂度 空间复杂度
O(m * n) O(m + n)

💡 解题思路二:使用矩阵第一行和第一列作为标记(原地操作)

🔍 思路

为了节省空间,我们可以利用矩阵的第一行和第一列来标记需要置 0 的行和列。

步骤如下:

  1. 用两个变量记录第一行和第一列是否需要置零;
  2. 使用剩下的矩阵作为标记区域;
  3. 倒序更新矩阵,防止污染标记。

✅ Go 实现

go 复制代码
func setZeroes(matrix [][]int) {
    m, n := len(matrix), len(matrix[0])
    firstRowZero := false
    firstColZero := false

    for i := 0; i < m; i++ {
        if matrix[i][0] == 0 {
            firstColZero = true
        }
    }
    for j := 0; j < n; j++ {
        if matrix[0][j] == 0 {
            firstRowZero = true
        }
    }

    for i := 1; i < m; i++ {
        for j := 1; j < n; j++ {
            if matrix[i][j] == 0 {
                matrix[i][0] = 0
                matrix[0][j] = 0
            }
        }
    }

    for i := 1; i < m; i++ {
        for j := 1; j < n; j++ {
            if matrix[i][0] == 0 || matrix[0][j] == 0 {
                matrix[i][j] = 0
            }
        }
    }

    if firstRowZero {
        for j := 0; j < n; j++ {
            matrix[0][j] = 0
        }
    }
    if firstColZero {
        for i := 0; i < m; i++ {
            matrix[i][0] = 0
        }
    }
}

📊 复杂度分析

时间复杂度 空间复杂度
O(m * n) O(1)

🧠 注意事项

  • 原地操作 时要避免一开始就修改标记信息,顺序非常关键;
  • 可以从矩阵尾部开始遍历,防止影响标记;
  • 考察空间压缩技巧,理解"用已有空间做标记"的思路。

✅ 总结

解法 是否原地操作 额外空间 思维难度
标记数组 ❌ 否 O(m+n) ⭐️⭐️
原地标记 ✅ 是 O(1) ⭐️⭐️⭐️⭐️

📌 推荐练习

  • 🔁 289. 生命游戏(原地标记问题)
  • 📦 54. 螺旋矩阵(二维数组遍历)
  • 🎯 面试经典题型,考察空间优化和矩阵操作能力

💡 如果觉得这篇文章对你有帮助,欢迎点赞 👍、收藏 ⭐、评论 💬、关注 💻!我会持续更新高质量 LeetCode 热题解析。一起刷题,一起进步!🚀🎯


相关推荐
小美爱刷题3 小时前
力扣DAY46-50 | 热100 | 二叉树:展开为链表、pre+inorder构建、路径总和、最近公共祖先、最大路径和
算法·leetcode·链表
_yingty_4 小时前
Go语言入门-反射4(动态构建类型)
开发语言·笔记·后端·golang
顾琬清6 小时前
Linux系统Docker部署开源在线协作笔记Trilium Notes与远程访问详细教程
开发语言·后端·golang
rigidwill6666 小时前
LeetCode hot 100—子集
数据结构·c++·算法·leetcode·职场和发展
阳洞洞7 小时前
leetcode 322. Coin Change
算法·leetcode·动态规划·完全背包问题
我是唐青枫8 小时前
如何用Go写一个benchmark 解析器及Web UI 数据可视化?
golang
不吃洋葱.9 小时前
力扣448.找到数组中所有消失的元素
数据结构·算法·leetcode
东方窅瞳10 小时前
Bash语言的哈希表
开发语言·后端·golang
编程绿豆侠12 小时前
力扣HOT100之链表:138. 随机链表的复制
算法·leetcode·链表
东方醴歌13 小时前
VMware安装飞牛私有云fnOS并挂载小雅Alist实现异地远程访问
开发语言·后端·golang