【LeetCode Hot100】 矩阵置零|原地标记,Java实现!图解+代码,小白也能秒懂!

LeetCode hot 100 解题思路记录(一) 重叠是则更新列表最后一个区间的右边界,取两者最大值否则直接添加到结果列表返回结果列表。 阅读详情

💻 [LeetCode Hot100] 矩阵置零|原地标记,Java实现!图解+代码,小白也能秒懂!

✏️本文对应题目链接:矩阵置零


📌 题目描述

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

示例:

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
解释:将第二行和第二列全部置零。

🧠 解题思路(图文分解)

❗ 核心难点

如何在O(1)空间复杂度内完成矩阵置零?


方法一:原地标记(黄金思路)✨

关键步骤:

  1. 标记首行和首列:
    • 使用首行和首列作为标记位,记录是否需要置零
    • 单独标记首行和首列是否需要置零
  2. 遍历矩阵:
    • 如果 matrix[i][j] == 0,则将 matrix[i][0] 和 matrix[0][j] 置零
  3. 根据标记置零:
    • 遍历首行和首列,将对应的行和列置零
    • 处理首行和首列是否需要置零

图解原地标记

输入矩阵:

matrix = [
  [1, 1, 1],
  [1, 0, 1],
  [1, 1, 1]
]

步骤1:标记首行和首列

首行是否需要置零:false
首列是否需要置零:false

步骤2:遍历矩阵

i=1, j=1: matrix[1][1]=0 → 标记matrix[1][0]=0, matrix[0][1]=0

步骤3:根据标记置零

- 根据matrix[1][0]=0,将第二行置零 → [1,0,1]
- 根据matrix[0][1]=0,将第二列置零 → [1,0,1]
- 最终矩阵:
[
  [1, 0, 1],
  [0, 0, 0],
  [1, 0, 1]
]

🚀 代码实现

class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        boolean firstRowZero = false; // 首行是否需要置零
        boolean firstColZero = false; // 首列是否需要置零
        
        // 标记首行和首列是否需要置零
        for (int i = 0; i < m; i++) {
            if (matrix[i][0] == 0) {
                firstColZero = true;
                break;
            }
        }
        for (int j = 0; j < n; j++) {
            if (matrix[0][j] == 0) {
                firstRowZero = true;
                break;
            }
        }
        
        // 遍历矩阵,标记需要置零的行和列
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][j] == 0) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }
        
        // 根据标记置零
        for (int i = 1; i < m; i++) {
            if (matrix[i][0] == 0) {
                for (int j = 1; j < n; j++) {
                    matrix[i][j] = 0;
                }
            }
        }
        for (int j = 1; j < n; j++) {
            if (matrix[0][j] == 0) {
                for (int i = 1; i < m; i++) {
                    matrix[i][j] = 0;
                }
            }
        }
        
        // 处理首行和首列
        if (firstRowZero) {
            for (int j = 0; j < n; j++) {
                matrix[0][j] = 0;
            }
        }
        if (firstColZero) {
            for (int i = 0; i < m; i++) {
                matrix[i][0] = 0;
            }
        }
    }
}

💡 复杂度分析

  • 时间复杂度:O(m * n) → 遍历矩阵两次
  • 空间复杂度:O(1) → 仅用常数空间

方法二:布尔数组标记(优化思路)

关键思路:使用两个布尔数组分别记录需要置零的行和列。

class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        boolean[] rowZero = new boolean[m]; // 记录需要置零的行
        boolean[] colZero = new boolean[n]; // 记录需要置零的列
        
        // 标记需要置零的行和列
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    rowZero[i] = true;
                    colZero[j] = true;
                }
            }
        }
        
        // 根据标记置零
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (rowZero[i] || colZero[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

🌟 总结要点

✅ 原地标记核心思想:利用首行和首列作为标记位,节省空间
✅ 布尔数组优化:空间复杂度O(m + n),适合小规模矩阵
✅ 适用场景:矩阵操作、稀疏矩阵处理


LeetCode hot 100 解题思路记录(二) 一次二分查找法,和搜索插入位置一样,只不过要查找的是范围,不是具体位置// 查找第一个大于等于target的位置(左边界)// 查找第一个大于target的位置,然后-1得到右边界。 阅读详情

相关推荐

SAP S4业务伙伴(BP)实战指南:从角色分配到数据同步的完整流程

本文详细解析了SAP S4业务伙伴(BP)功能,从基础概念到实战操作,涵盖角色分配、数据同步及常见问题排查。通过BP机制,企业可高效管理客户、供应商等多重身份,实现数据共享和动态切换,显著提升主数据管理效率。特别适合SAP实施顾问和ERP管理员参考。

y2z3a4b5c的博客 869

【LeetCode Hot100】旋转图像|原地旋转 vs 转置+反转,Java实现,图解+代码

✅原地旋转核心思想:通过四元素交换实现分层旋转✅转置+反转核心:利用矩阵性质简化操作✅适用场景:图像处理、矩阵变换。

AllowM的博客 493

Unity ECS 之 Entitas 的简单介绍,插件下载、导入,和简单使用(一篇文入门搞懂ECS是什么)

Unity ECS 之 Entitas 的简单介绍,插件下载、导入,和简单使用(一篇文入门搞懂ECS是什么) 目录 Unity ECS 之 Entitas 的简单介绍,插件下载、导入,和简单使用(一篇文入门搞懂ECS是什么) 一、简单介绍 二、一些专有项简介 Entity Context Group Collector Matcher System Feature 三、注意实现 四、ECS 的下载 Github 上下载 Unity Asset Store 中下载 U...

仙魁XAN 7779

【LeetCode Hot100】螺旋矩阵|边界模拟,Java实现,图解+代码

✅边界模拟核心思想:通过缩小边界模拟螺旋遍历✅方向模拟法核心:利用方向数组处理复杂路径问题✅适用场景:矩阵遍历、路径模拟。

AllowM的博客 472

用 Coze 打造纯自动化 AI 情报助手

本文将引导您逐步构建一个简易的AI情报助手,从提示词到工作流,再到卡片消息,详细讲解了如何利用Coze平台开发自动化工具。过程简单易懂,何不亲自动手一试?如果您对此类内容感兴趣,敬请关注本作者。未来,我将带来更多精彩的AI工具教程,助您迅速掌握各类AI应用。在这个AI时代,让您领先一步。t=O83A2AGI.NET AI 教程 震撼!用 Coze 打造纯自动化 AI 情报助手震撼!

xinzhaobuxuan的博客 2531

具身智能的边缘计算核心构成方案

摘要: 具身智能(Embodied Intelligence)依赖物理实体与环境交互,而边缘计算(Edge Computing)通过本地化数据处理降低延迟、提升实时性。两者结合的核心方案包含五层架构:传感器层采集环境数据,边缘处理单元执行本地计算,通信模块实现低延迟传输,决策引擎运行轻量AI模型,执行器接口转化动作为物理操作。该方案以“边缘优先”为原则,满足毫秒级响应(如延迟<50ms),同时优化能效(功耗降低30%)和隐私保护。适用于机器人、自动驾驶等场景,通过分层闭环设计确保在资源受限环境中的可靠

老郑的博客 810

【LeetCode Hot100】搜索二维矩阵 II[特殊字符]二分查找 vs 线性搜索,Java实现,图解+代码

✅线性搜索核心思想:利用矩阵特性从右上角开始搜索✅二分查找优化:适合列数较大的矩阵✅适用场景:有序矩阵搜索、二维数组查找。

AllowM的博客 447

基于PCL的电力线点云提取与分割实现

本文基于PCL库实现电力线点云提取与分割,包含6个核心处理阶段:文件读取与结果文件夹创建、高程滤波分割候选点云、欧式聚类去噪、电力线分段提取、球形邻域搜索补全点云、最终分割与可视化保存。通过PCA计算点云线性特征(阈值0.91)筛选电力线点,采用欧式聚类(容忍度3.0)去除噪点,并针对不同规模聚类差异化设置球形搜索半径(4.0/6.0)补全点云。最终通过欧式聚类分割并可视化带颜色点云。算法对高程滤波阈值、聚类参数等具有敏感性,需根据点云特性调整优化。

weixin_45196569的博客 192

【矩阵专题】Leetcode54.螺旋矩阵(Hot100)

本文介绍了螺旋矩阵问题的解法,通过模拟从外向内逐层遍历的过程。使用四个边界变量(left,right,top,bottom)控制遍历范围,依次按顺时针方向遍历矩阵元素,每完成一圈后缩小边界范围。关键点在于遍历过程中需要判断是否还有未访问的行/列,避免重复或越界访问。该方法时间复杂度O(mn),空间复杂度O(1)(不计输出空间)。

2302_81116822的博客 399

【灰度共生矩阵(GLCM)原理及代码实现】

文章主旨详细介绍灰度共生矩阵(Gray-Level Co-occurrence Matrix, GLCM)的生成原理、核心特征量及其在图像纹理分析中的应用,并提供了可运行的Python代码实现。该网页是一篇理论结合实践的优秀技术文章。它不仅清晰地解释了GLCM这一经典纹理分析工具背后的数学原理,还提供了完整、可复现的代码,非常适合计算机视觉或图像处理领域的学习者和开发者入门并实践灰度共生矩阵。读者可以通过运行代码来直观理解GLCM如何工作,并提取图像的纹理特征。

blotemj.blog.youkuaiyun.com 179

RK3588网卡出现丢包或者带宽不足的问题验证排查

注意除了有最大的TCP数据接收缓冲,还有/proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲可以调整,这里暂时没用到,针对具体需要可适当调整。比如把ethx接口中断从默认的cpu0迁移到其它cpu,例如将eth0中断234移到cpu7 (10是16进制, cpu0 =3588的cpu有8个核,4个A55(小核)+4个A76(大核),可以找到对应中断 将中断从默认cpu0核切到cpu7。tcp_rmem:单位是字节,接收缓存区大小,缓存从对端接收的数据,后续会被应用程序读取。

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 2027

力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)

本文介绍了力扣第48题"旋转图像"的原地解法。通过分析矩阵旋转规律,发现四个位置元素形成循环交换关系。核心思路是:仅遍历矩阵左上角区域,对每个元素进行四位置轮换操作。奇数阶矩阵需特殊处理中心列左侧区域。该方法时间复杂度O(n²),空间复杂度O(1),通过临时变量实现原地旋转,无需额外空间。理解位置映射(i,j)→(j,n-1-i)是解决该问题的关键。

ze15829163918的博客 694

挖矿病毒解决实例(隐藏进程,文章较好)(入侵)

CPU起飞了 最近有朋友在群里反馈,自己服务器的CPU一直处于高占用状态,但用top、ps等命令却一直找不到是哪个进程在占用,怀疑中了挖矿病毒,急的团团转。 根据经验,我赶紧让他看一下当前服务器的网络连接,看看有没有可疑连接,果然发现了有点东西: 上Shodan查一下这IP地址: 反向查找,发现有诸多域名曾经解析到这个IP地址: 这是一个位于德国的IP地址,开放了4444,5555,7777等数个特殊的服务端口: 其中这位朋友服务器上发现的连接到的是7777端口,

墨痕诉清风的博客 1万+

LeetCode Hot100(17/100)——240. 搜索二维矩阵 II

搜索二维矩阵 II给定一个m×nm \times nm×n的矩阵matrix每一行的元素从左到右升序排列;每一列的元素从上到下升序排列;请编写一个高效的算法,判断矩阵中是否存在一个目标值target。输入:matrix = [target = 5输出:true解法思路说明时间复杂度空间复杂度是否利用有序性暴力遍历逐个扫描O(m×n)O(1)否行二分查找每行二分O(m×log n)O(1)行有序右上角搜索剪枝搜索O(m+n)O(1)行列均有序。

TracyCoder的博客 674

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LeetCode--HOT100题(19)

LeetCode热题100第十九题-spiralOrder

CJPSR的博客 417

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

力扣hot100:搜索二维矩阵 II(常见误区与高效解法详解)(240)

本文分析了LeetCode"搜索二维矩阵II"问题的两种解法。初始错误解法采用对角线移动策略,存在路径不可靠、边界处理不当和效率低下(O(n²))的问题。高效解法从矩阵右上角出发,通过比较当前值与目标值决定向左或向下移动,逐步缩小搜索范围。该方法时间复杂度为O(m+n),空间复杂度O(1),充分利用了矩阵行列有序的特性,比暴力搜索和逐行二分更高效。建议在实际应用中优先采用这种简洁直观的解法。

ze15829163918的博客 747

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

[剑指 offer]--面试题12. 矩阵中的路径/Hot100---单词搜索--DFS+剪枝

1 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。 [[“a”,“b”,“c”,“e”], [“s”,“f”,“c”,“s”], [...

努力变得不菜的菜鸡的博客 409

[ 热题 HOT 100]---64. 最小路径和--- 动态规划

1 题目描述 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例: 输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/minimum-path-sum 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 2 解

努力变得不菜的菜鸡的博客 281

hot100——动态规划

动态规划(英语:Dynamic programming,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和性质的问题。动态规划从较小问题的解,由交叠性质,逐步决策出较大问题的解,它是从f(1)往f(10)方向,往上推求解,所以称为的解法。动态规划有几个典型特征,。如果一个问题,可以把所有可能的答案穷举出来,并且穷举出来后,发现存在重叠子问题,就可以考虑使用动态规划。

weixin_50422106的博客 397

Hot 100 --- 分割回文串

本文以LeetCode题目"分割回文串"为例,讲解如何用动态规划预处理回文表,以及回溯切割方案的设计

LI_124301012的博客 235

LeetCode刷题全攻略:从零基础到进阶的系统化方法与实战案例

算法与数据结构是计算机科学的核心基础,其原理在于通过特定的数据组织方式和计算步骤,高效解决复杂问题。掌握这些基础能显著提升开发者的逻辑思维、问题分解与编码实现能力,对于构建高性能软件、优化系统资源至关重要。在工程实践中,算法能力是技术面试的核心考察点,尤其在互联网大厂的招聘中,LeetCode平台已成为衡量候选人技术水平的重要标尺。通过系统性的刷题训练,开发者不仅能巩固如**双指针**、**动态规划**等关键技术概念,还能熟悉面试常见题型与思维模式,从而在求职或技能提升场景中脱颖而出。本文聚焦于提供一套可复

anjichan4261的博客 374

程序员成长全栈资源指南:从入门到精通的实战路径

在软件开发领域,系统化的学习路径和高效工具链是开发者能力跃迁的关键。编程语言基础与算法数据结构构成技术基石,通过可视化工具和LeetCode等平台可建立扎实的工程思维。现代开发工具如VSCode插件生态和命令行技巧能显著提升编码效率,而Git协作规范与Code Review实践则是团队产出的质量保障。技术社区和持续学习渠道帮助开发者保持前沿敏感度,结合知识管理工具构建个人技术体系。无论是Python PEP8规范还是Conventional Commits提交标准,遵循工程最佳实践能避免常见开发陷阱。本指南

weixin_34319111的博客 391

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等) 题目描述: 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: - s = s1 + s2 + ... + sn - t = t1 + t2 + ... + tm - |n - m| <= 1 - 交错 是 s1 + t

huayimenghan的博客 207

LeetCode 每日一题 2026/11/2-2026/11/8

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步

AlphaTao的博客 175

Hash表:两数之和、字母异位词分组、最长连续序列 [力扣 Hot100]

三道高频哈希表应用题:两数之和(利用HashMap快速查找补数)、字母异位词分组(排序后作为键分组)、最长连续序列(通过HashSet去重并仅从序列起点扩展)。核心思想均为借助哈希结构优化查找效率,避免重复计算。同时提及双指针等其他解法思路,体现算法设计中“空间换时间”的典型策略。

2403_87560480的博客 218
上一篇: 【LeetCode Hot100】缺失的第一个正数|原地哈希,Java实现!图解+代码,小白也能秒懂!
下一篇: 【LeetCode Hot100】螺旋矩阵|边界模拟,Java实现,图解+代码
AllowM
博客等级 码龄7年 111粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值