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

简介: 这篇文章详细解析了力扣热题 73——矩阵置零问题,提供两种解法:一是使用额外标记数组,时间复杂度为 O(m * n),空间复杂度为 O(m + n);二是优化后的原地标记方法,利用矩阵的第一行和第一列记录需要置零的信息,将空间复杂度降低到 O(1)。文章通过清晰的代码示例与复杂度分析,帮助理解“原地操作”及空间优化技巧,并推荐相关练习题以巩固矩阵操作能力。适合刷题提升算法思维!

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


目录
相关文章
|
28天前
|
Go
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣437 / 236 )(Go语言版)
本文深入探讨二叉树中路径与祖先问题,涵盖两道经典题目:LeetCode 437(路径总和 III)和236(最近公共祖先)。对于路径总和 III,文章分析了双递归暴力解法与前缀和优化方法,后者通过哈希表记录路径和,将时间复杂度从O(n²)降至O(n)。在最近公共祖先问题中,采用后序遍历递归查找,利用“自底向上”的思路确定最近公共祖先节点。文中详细解析代码实现与核心要点,帮助读者掌握深度追踪技巧,理解树结构中路径与节点关系的本质。这类问题在面试中高频出现,掌握其解法意义重大。
49 4
|
1月前
|
算法 Go
【LeetCode 热题100】深入理解二叉树结构变化与路径特性(力扣104 / 226 / 114 / 543)(Go语言版)
本博客深入探讨二叉树的深度计算、结构变换与路径分析,涵盖四道经典题目:104(最大深度)、226(翻转二叉树)、114(展开为链表)和543(二叉树直径)。通过递归与遍历策略(前序、后序等),解析每题的核心思路与实现方法。结合代码示例(Go语言),帮助读者掌握二叉树相关算法的精髓。下一讲将聚焦二叉树构造问题,欢迎持续关注!
56 10
|
1月前
|
存储 算法 数据可视化
【二叉树遍历入门:从中序遍历到层序与右视图】【LeetCode 热题100】94:二叉树的中序遍历、102:二叉树的层序遍历、199:二叉树的右视图(详细解析)(Go语言版)
本文详细解析了二叉树的三种经典遍历方式:中序遍历(94题)、层序遍历(102题)和右视图(199题)。通过递归与迭代实现中序遍历,深入理解深度优先搜索(DFS);借助队列完成层序遍历和右视图,掌握广度优先搜索(BFS)。文章对比DFS与BFS的思维方式,总结不同遍历的应用场景,为后续构造树结构奠定基础。
132 10
|
1月前
|
Go 索引 Perl
【LeetCode 热题100】【二叉树构造题精讲:前序 + 中序建树 & 有序数组构造 BST】(详细解析)(Go语言版)
本文详细解析了二叉树构造的两类经典问题:通过前序与中序遍历重建二叉树(LeetCode 105),以及将有序数组转化为平衡二叉搜索树(BST,LeetCode 108)。文章从核心思路、递归解法到实现细节逐一拆解,强调通过索引控制子树范围以优化性能,并对比两题的不同构造逻辑。最后总结通用构造套路,提供进阶思考方向,帮助彻底掌握二叉树构造类题目。
110 9
|
26天前
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
35 0
|
8月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
114 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
9月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
97 6
|
9月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
199 2
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
163 1
|
8月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
103 3
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口