当前位置: 首页 > news >正文

【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 实现

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 实现

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 热题解析。一起刷题,一起进步!🚀🎯


http://www.dtcms.com/a/121791.html

相关文章:

  • 调用百度api实现黑白图像上色
  • Prompt_Engineering提示词工程(一)
  • Python脚本:批量修改文件修改时间2.0(带UI界面+随机时间偏移)
  • Java面试黄金宝典43
  • Apache Parquet Java 库 反序列化漏洞 CVE-2025-30065
  • 分布式文件存储系统FastDFS
  • Linux 入门指令(1)
  • spring boot 中 WebClient 与 RestTemplate 的对比总结
  • Unity中基于2.5D的碰撞系统
  • 数据库中的事务
  • 柑橘病虫害图像分类数据集OrangeFruitDaatset-8600
  • 开发一个环保回收小程序需要哪些功能?环保回收小程序
  • Java程序的基本规则
  • PS教学记录
  • Java 常用安全框架的 授权模型 对比分析,涵盖 RBAC、ABAC、ACL、基于权限/角色 等模型,结合框架实现方式、适用场景和优缺点进行详细说明
  • 信用卡欺诈检测实战教程:从数据预处理到模型优化全解析
  • 什么是声波,声波的传播距离受哪些因素影响?
  • 【RL系列】StepFun之Open-Reasoner-Zero
  • 机器学习 Day09 KNN算法
  • 大数据专业学习路线
  • 某团某点评mtgsig1.2 H5guard加密算法剖析
  • 深入解析Java中的栈:从JVM原理到开发实践
  • 基于IDEA+SpringBoot+Mave+Thymeleaf的系统实现
  • 量子计算入门:开启未来计算的次元之门
  • 华为数字芯片机考2025合集4已校正
  • 【安卓】APP生成器v1.0,生成属于你的专属应用
  • FRP练手:hello,world实现
  • JavaScript的可选链操作符 ?.
  • 【WPF】IOC控制反转的应用:弹窗但不互相调用ViewModel
  • 构建实时、融合的湖仓一体数据分析平台:基于 Delta Lake 与 Apache Iceberg