hot100——矩阵

发布时间:2026/9/30 7:21:45

hot100——矩阵 矩阵置零73. 矩阵置零 - 力扣LeetCode给定一个mxn的矩阵如果一个元素为0则将其所在行和列的所有元素都设为0。请使用原地算法。示例 1输入matrix [[1,1,1],[1,0,1],[1,1,1]]输出[[1,0,1],[0,0,0],[1,0,1]]输入matrix [[0,1,2,0],[3,4,5,2],[1,3,1,5]]输出[[0,0,0,0],[0,4,5,0],[0,3,1,0]]解法及思路用第一行和第一列做标记核心思想不用额外数组直接用矩阵的第一行和第一列来标记 matrix[i][0] 0 → 第i行要置零 matrix[0][j] 0 → 第j列要置零但是问题来了第一行和第一列本身也可能要置零 如果用它们做标记就分不清 matrix[0][j]0 是原本就是0还是标记所以需要额外两个变量boolean firstRowZero false; // 第一行本身是否要置零 boolean firstColZero false; // 第一列本身是否要置零举例matrix [[1, 2, 3, 4],[5, 0, 7, 8],[9, 10, 0, 12],[13, 14, 15, 16]]第1步检查第一行是否有0第一行[1, 2, 3, 4]没有0 → firstRowZero false第2步检查第一列是否有0第一列[1, 5, 9, 13]没有0 → firstColZero false第3步用第一行/列标记内层遍历内层i1, j1: matrix[1][1]0 matrix[1][0] 0 ← 标记第1行 matrix[0][1] 0 ← 标记第1列 i1, j2: matrix[1][2]7不是0 i1, j3: matrix[1][3]8不是0 i2, j1: matrix[2][1]10不是0 i2, j2: matrix[2][2]0 matrix[2][0] 0 ← 标记第2行 matrix[0][2] 0 ← 标记第2列 i2, j3: matrix[2][3]12不是0 i3, j1: matrix[3][1]14不是0 i3, j2: matrix[3][2]15不是0 i3, j3: matrix[3][3]16不是0标记后矩阵[1, 0, 0, 4] ← matrix[0][1]0, matrix[0][2]0 [0, 0, 7, 8] ← matrix[1][0]0 [0, 10, 0, 12] ← matrix[2][0]0 [13, 14, 15, 16]第一行标记了第1列和第2列第一列标记了第1行和第2行第4步根据标记置零内层遍历内层i1, j1: matrix[1][0]0 → 置0 矩阵[1,0,0,4] [0,0,7,8] [0,10,0,12] [13,14,15,16] i1, j2: matrix[0][2]0 → 置0 矩阵[1,0,0,4] [0,0,0,8] [0,10,0,12] [13,14,15,16] i1, j3: matrix[1][0]0 → 置0 矩阵[1,0,0,4] [0,0,0,0] [0,10,0,12] [13,14,15,16] i2, j1: matrix[2][0]0 → 置0 矩阵[1,0,0,4] [0,0,0,0] [0,0,0,12] [13,14,15,16] i2, j2: matrix[2][0]0 → 置0 矩阵[1,0,0,4] [0,0,0,0] [0,0,0,12] [13,14,15,16] i2, j3: matrix[0][2]0 → 置0 矩阵[1,0,0,4] [0,0,0,0] [0,0,0,0] [13,14,15,16] i3, j1: matrix[3][0]13, matrix[0][1]0 → 置0 矩阵[1,0,0,4] [0,0,0,0] [0,0,0,0] [13,0,15,16] i3, j2: matrix[0][2]0 → 置0 矩阵[1,0,0,4] [0,0,0,0] [0,0,0,0] [13,0,0,16] i3, j3: matrix[3][0]13, matrix[0][3]4 → 不置零 矩阵[1,0,0,4] [0,0,0,0] [0,0,0,0] [13,0,0,16]置零后矩阵[1, 0, 0, 4] [0, 0, 0, 0] [0, 0, 0, 0] [13, 0, 0, 16]第5步处理第一行firstRowZero false→ 不处理[1, 0, 0, 4] [0, 0, 0, 0] [0, 0, 0, 0] [13, 0, 0, 16]第6步处理第一列firstColZero false→ 不处理[1, 0, 0, 4] [0, 0, 0, 0] [0, 0, 0, 0] [13, 0, 0, 16]最终结果[1, 0, 0, 4] [0, 0, 0, 0] [0, 0, 0, 0] [13, 0, 0, 16] ✅class Solution { public void setZeroes(int[][] matrix) { int m matrix.length; int n matrix[0].length; boolean firstRowZero false; boolean firstColZero false; // 第1步检查第一行 for (int j 0; j n; j) { if (matrix[0][j] 0) firstRowZero true; } // 第2步检查第一列 for (int i 0; i m; i) { if (matrix[i][0] 0) firstColZero true; } // 第3步标记 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; // 标记列 } } } // 第4步置零 for (int i 1; i m; i) { for (int j 1; j n; j) { if (matrix[i][0] 0 || matrix[0][j] 0) { matrix[i][j] 0; } } } // 第5步处理第一行 if (firstRowZero) { for (int j 0; j n; j) matrix[0][j] 0; } // 第6步处理第一列 if (firstColZero) { for (int i 0; i m; i) matrix[i][0] 0; } } }螺旋矩阵54. 螺旋矩阵 - 力扣LeetCode给你一个m行n列的矩阵matrix请按照顺时针螺旋顺序返回矩阵中的所有元素。示例 1输入matrix [[1,2,3],[4,5,6],[7,8,9]]输出[1,2,3,6,9,8,7,4,5]示例 2输入matrix [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出[1,2,3,4,8,12,11,10,9,5,6,7]解法及思路边界收缩用四个边界top 0 上边界 bottom m - 1 下边界 left 0 左边界 right n - 1 右边界按顺序遍历1. 从左到右top 行left → right 2. 从上到下right 列top → bottom 3. 从右到左bottom 行right → left 4. 从下到上left 列bottom → top 每遍历完一条边收缩对应边界输入[1, 2, 3] [4, 5, 6] [7, 8, 9]初始边界top0, bottom2, left0, right2第1步从左到右top行top0, left→right: 1, 2, 3 结果[1, 2, 3] top → top1第2步从上到下right列right2, top→bottom: 6, 9 结果[1, 2, 3, 6, 9] right-- → right1第3步从右到左bottom行bottom2, right→left: 8, 7 结果[1, 2, 3, 6, 9, 8, 7] bottom-- → bottom1第4步从下到上left列left0, bottom→top: 4 结果[1, 2, 3, 6, 9, 8, 7, 4] left → left1第5步从左到右top行top1, left→right: 5 结果[1, 2, 3, 6, 9, 8, 7, 4, 5] top → top2结束top2 bottom1退出循环结果[1, 2, 3, 6, 9, 8, 7, 4, 5]✅class Solution { public ListInteger spiralOrder(int[][] matrix) { ListInteger result new ArrayList(); if (matrix null || matrix.length 0) return result; int top 0, bottom matrix.length - 1; int left 0, right matrix[0].length - 1; while (top bottom left right) { // 1. 从左到右 for (int j left; j right; j) { result.add(matrix[top][j]); } top; // 2. 从上到下 for (int i top; i bottom; i) { result.add(matrix[i][right]); } right--; // 3. 从右到左需要判断是否还有行 if (top bottom) { for (int j right; j left; j--) { result.add(matrix[bottom][j]); } bottom--; } // 4. 从下到上需要判断是否还有列 if (left right) { for (int i bottom; i top; i--) { result.add(matrix[i][left]); } left; } } return result; } }旋转图像48. 旋转图像 - 力扣LeetCode给定一个n×n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转 90 度。你必须在原地旋转图像这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例 1输入matrix [[1,2,3],[4,5,6],[7,8,9]]输出[[7,4,1],[8,5,2],[9,6,3]]示例 2输入matrix [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]输出[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]解法及思路先转置再反转顺时针旋转 90 度 转置 每行反转第1步转置行列互换 [1, 2, 3] [1, 4, 7] [4, 5, 6] → [2, 5, 8] [7, 8, 9] [3, 6, 9] 第2步每行反转 [1, 4, 7] [7, 4, 1] [2, 5, 8] → [8, 5, 2] [3, 6, 9] [9, 6, 3] ✅输入[1, 2, 3] [4, 5, 6] [7, 8, 9]第1步转置转置就是matrix[i][j]和matrix[j][i]交换。i0, j1: 交换 matrix[0][1] 和 matrix[1][0] 2 和 4 交换 [1, 4, 3] [2, 5, 6] [7, 8, 9] i0, j2: 交换 matrix[0][2] 和 matrix[2][0] 3 和 7 交换 [1, 4, 7] [2, 5, 6] [3, 8, 9] i1, j2: 交换 matrix[1][2] 和 matrix[2][1] 6 和 8 交换 [1, 4, 7] [2, 5, 8] [3, 6, 9] 转置完成第2步每行反转第0行[1, 4, 7] → [7, 4, 1] 第1行[2, 5, 8] → [8, 5, 2] 第2行[3, 6, 9] → [9, 6, 3] 结果 [7, 4, 1] [8, 5, 2] [9, 6, 3] ✅class Solution { public void rotate(int[][] matrix) { int n matrix.length; // 第1步转置 for (int i 0; i n; i) { for (int j i 1; j n; j) {// 注意j 从 i1 开始,只遍历上三角避免重复交换 int temp matrix[i][j]; matrix[i][j] matrix[j][i]; matrix[j][i] temp; } } // 第2步每行反转 for (int i 0; i n; i) { for (int j 0; j n / 2; j) {// 只遍历前一半 int temp matrix[i][j]; matrix[i][j] matrix[i][n - 1 - j]; matrix[i][n - 1 - j] temp; } } } }搜索二维矩阵||240. 搜索二维矩阵 II - 力扣LeetCode编写一个高效的算法来搜索mxn矩阵matrix中的一个目标值target。该矩阵具有以下特性每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例 1输入matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target 5输出true示例 2输入matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target 20输出false解法及思路从右上角开始关键右上角的元素有特殊性质。右上角15 比15小的左边所有元素同一行左边 比15大的下边所有元素同一列下边 所以 target 15 → 往左走排除这一列 target 15 → 往下走排除这一行 target 15 → 找到为什么从右上角因为右上角是这一行最大这一列最小 可以明确判断往哪走输入[1, 4, 7, 11, 15] [2, 5, 8, 12, 19] [3, 6, 9, 16, 22] [10, 13, 14, 17, 24] [18, 21, 23, 26, 30] target 5从右上角开始初始row0, col4 matrix[0][4] 15 15 5 → 往左走col3 matrix[0][3] 11 11 5 → 往左走col2 matrix[0][2] 7 7 5 → 往左走col1 matrix[0][1] 4 4 5 → 往下走row1 matrix[1][1] 5 5 5 → 找到✅class Solution { public boolean searchMatrix(int[][] matrix, int target) { int mmatrix.length; int nmatrix[0].length; int row 0; // 从右上角开始 int col n - 1; while(rowmcol0){ if(matrix[row][col]target){ return true; }else if(matrix[row][col]target){ col--;//大了往左 }else{ row;//小了往下 } } return false; } }
延伸阅读

更多相关文章

2026/9/30 7:21:45

Heric锁相环和电流环路反馈角度的关系

问题:在仿真时发现并网逆变器环路控制与角度强相关,当PLL锁相采用q轴电压时,此时id若乘以sin,则系统无法有效控制功率;若id乘以cos,则系统可以通过环路控制。可在绝大多数的文献中,环路中常常用…

2026/9/30 7:21:45

二分查找系列一

前言 二分查找属于最恶心,细节最多,最容易写出死循环的算法。但是同是也是很简单的算法,因为有模板而且很容易学会。主要应用与数组有序或者无序(有规律)的情况下。 模板主要是朴素二分模板、查找左边界的二分模板、查找右边界的二分模板。…

2026/9/30 7:21:45

Git实战指南:从零开始高效协作开发

最近实习对git使用有感,所以写一个git使用流程记录一下。以及配合使用SourceTree推拉代码流程。1. 第一次获取代码1.1. 获取仓库权限每个公司都有自己的代码仓库,我们要获取公司的代码就得去跟管理员申请一个账号。比如说GitLab的话,公司给你…

2026/9/30 8:21:49

AI项目总翻车?四个风险域框架帮你系统排查

1. 从“四个风险域”说起:为什么AI项目总在同一个地方翻车做AI项目这些年,我越来越觉得,真正让项目翻车的往往不是模型不够强,而是团队对风险的认知太窄。很多人一提AI风险,脑子里只有“模型会不会胡说八道”这一件事&…

2026/9/30 8:21:49

接口安全测试:容易被忽略的 API 高危漏洞盘点

接口安全测试:容易被忽略的 API 高危漏洞盘点 前言 现在前后端分离、小程序、APP、H5 业务,几乎所有交互都依靠 API 接口。很多安全测试人员习惯性使用扫描器,重点检测 SQL 注入、XSS 这类传统 Web 漏洞。但 API 场景下,大量高危…

2026/9/30 8:21:49

IS62WV102416BLL替代EMI国产高速异步SRAM

在工控主板、通信设备、运动控制器等硬件设计中,IS62WV102416BLL是ISSI一款非常经典的16Mbit(1024K16)高速异步CMOS SRAM。器件采用2.4V‑3.6V供电,25ns访问速度,配备CS1、CS2双片选控制,支持UB#、LB#高低字…

2026/9/30 8:21:49

大模型训练显存优化:参数空间切分实战指南

1. 参数空间切分到底在解决什么问题 大模型训练这件事,外行看热闹,内行看显存。很多人第一次接触LLM训练时,最直观的感受就是:模型大得离谱,显存永远不够,训练速度永远比预期慢。但真正做过一段时间之后你会…

2026/9/30 8:21:49

Node.js升级全指南:从LTS版本选择到全局包迁移避坑

写这篇文章之前,我先说个背景。很多前端朋友都有过这种经历:项目起来了,一运行发现node -v还是 16 甚至 14,新版框架要求 Node 20,或者某些依赖报错,最后排查半天发现是 Node 版本太低。升级 Node.js 这个操…

2026/9/30 8:16:48

Model-Optimizer实战:训练图到推理图的模型部署优化指南

1. Model-Optimizer 解决的是什么场景下的什么问题:训练收敛不等于部署可用我第一次认真研究 Model-Optimizer 这个工具,是因为一次边缘设备部署翻车事件。模型在 GPU 上推理很快,FPS 能跑到 300,可一搬到目标硬件上,延…

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 0:01:22

MATLAB+Yalmip+CPLEX实战:综合能源系统优化调度全流程解析

做综合能源系统优化调度这活儿,最痛苦的不是建模本身,而是模型写完之后不知道该怎么求解。看论文里轻飘飘一句“采用Yalmip调用CPLEX求解”,自己上手时却往往卡在环境配置、变量声明、约束写法和求解状态判读上,一耗就是两三天。这…

2026/9/30 0:01:22

I3C比I2C快10倍?RK3576实战:速率、DTS配置与混合总线避坑指南

I3C 比 I2C 快 10 倍?这句话在嵌入式群里传了很久,每次都能吵出一堆截图。前段时间我正好在 RK3576 上调板级 I3C 接口,从控制器寄存器一路摸到 Linux DTS 配置,踩了不少坑,也把这笔速度账彻底算明白了。本文就用 RK35…

2026/9/30 0:01:22

字符串转对象:JSON.parse、new Function与URLSearchParams

“字符串转对象”这几个字,我在技术群里见过的问法至少有十几种:有人拿着一串{a:1,b:2}说 JSON.parse 直接报错,有人要从 URL 里抠出参数,还有人只是想把abc变成能挂属性的东西。js 这门语言里,字符串和对象之间的转换…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/29 6:36:14

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑