力扣hot100-240.搜索二维矩阵2-单调性剪枝详解

作者:闪电悠米日期:2026/7/30

LeetCode 240. 搜索二维矩阵 II:单调性剪枝详解

1. 算法思想

这题属于:

1矩阵搜索 / 单调性剪枝
2

也常被称为 Z 字形搜索。它不是普通二分查找:每一行、每一列分别有序,但整个矩阵按行展开后并不整体有序。

例如:

1[
2  [1, 4, 7],
3  [2, 5, 8],
4  [3, 6, 9]
5]
6

按行展开是 1, 4, 7, 2, 5, 8, 3, 6, 9,其中 7 后面是 2,因此不能把它当一维数组二分。

本题的关键是:从右上角开始,每次比较都能确定排除一整行或一整列。

2. 为什么从右上角开始

右上角 matrix[0][n - 1] 有两个相反的单调方向:

1左边都更小。
2下面都更大。
3

因此当前位置 matrix[row][col]target 比较后,移动方向是确定的:

1current > target:向左,排除当前列。
2current < target:向下,排除当前行。
3current == target:找到答案。
4

当前值过大,为什么排除当前列

如果:

1current > target
2

当前列从上到下递增。从当前行往下的元素都满足:

1matrix[i][col] >= current > target
2

整列都太大,不可能有答案,因此:

1col--;
2

当前值过小,为什么排除当前行

如果:

1current < target
2

当前行从左到右递增。当前剩余区域中,这一行从左边界到当前列的所有元素都满足:

1matrix[row][j] <= current < target
2

整行都太小,不可能有答案,因此:

1row++;
2

3. 用 target = 5 完整模拟

1matrix =
2[
3  [1,  4,  7, 11, 15],
4  [2,  5,  8, 12, 19],
5  [3,  6,  9, 16, 22],
6  [10, 13, 14, 17, 24],
7  [18, 21, 23, 26, 30]
8]
9

从右上角开始:

1row = 0, col = 4,当前值 15
215 > 5,向左。
3
4row = 0, col = 3,当前值 11
511 > 5,向左。
6
7row = 0, col = 2,当前值 7
87 > 5,向左。
9
10row = 0, col = 1,当前值 4
114 < 5,向下。
12
13row = 1, col = 1,当前值 5
14找到目标。
15

路径是:

115 -> 11 -> 7 -> 4
2                   |
3                   v
4                   5
5

因此这类搜索也叫 Z 字形搜索。

4. 为什么不会漏掉答案

当前位置始终是当前剩余区域的右上角。

1当前值大于 target:当前列下面的值更大,整列排除安全。
2当前值小于 target:当前行左边的值更小,整行排除安全。
3

每一步删除的都是确定不可能包含 target 的区域。搜索会在找到目标,或剩余区域为空时结束,因此不会漏掉答案。

5. Java 代码完整注释

1class Solution {
2    public boolean searchMatrix(int[][] matrix, int target) {
3        // 空矩阵中不存在目标。
4        if (matrix.length == 0 || matrix[0].length == 0) {
5            return false;
6        }
7
8        int m = matrix.length;
9        int n = matrix[0].length;
10
11        // 从右上角开始。
12        int row = 0;
13        int col = n - 1;
14
15        // row 只向下移动,col 只向左移动。
16        // 任一指针越界时,说明剩余区域为空。
17        while (row < m && col >= 0) {
18            int current = matrix[row][col];
19
20            if (current == target) {
21                return true;
22            }
23
24            if (current > target) {
25                // 当前列从上到下递增,下面的元素只会更大。
26                // 所以当前列不可能有 target,向左排除它。
27                col--;
28            } else {
29                // 当前行从左到右递增,左边的元素只会更小。
30                // 所以当前行不可能有 target,向下排除它。
31                row++;
32            }
33        }
34
35        return false;
36    }
37}
38

6. 左下角也可以

左下角同样有相反的单调方向:上面更小,右边更大。

因此从左下角开始也可以:

1当前值大于 target:向上。
2当前值小于 target:向右。
3

它与右上角写法本质相同。学习时固定记住右上角版本即可:

1大了向左,小了向下。
2

7. 复杂度分析

每一步只会向左移动一列,或者向下移动一行。

1最多向左 n 次。
2最多向下 m 次。
3

所以时间复杂度是:

1O(m + n)
2

额外空间复杂度是:

1O(1)
2

8. 总结

这题属于矩阵搜索 / 单调性剪枝。

从右上角开始:

1当前值 > target:当前列全都太大,向左。
2当前值 < target:当前行全都太小,向下。
3

每一步排除一整行或一整列,因此效率是 O(m + n)

一句话记忆:

1从右上角开始:大了向左,小了向下。
2

力扣hot100-240.搜索二维矩阵2-单调性剪枝详解》 是转载文章,点击查看原文


相关推荐


「寒草呈献」工作六年,是否仍有创造未来的勇气 ✨
寒草2026/7/22

大家好,我是寒草 🌿 封笔多年,这一篇文章,献给自己~ 六年似弹指一瞬 2020 年盛夏至今,我已工作满整整六年,此间经历颇多。 『踌躇』 2020 年下半年,虽步履蹒跚,不知前路何方,仍一边裹着焦虑一边四处探寻。ps:还曾记得我当时为何来到我现在所在的公司,仅是因为董事长所谓『梦想』的感召。 「肆意」 2021 年开始在掘金创作,我自视与众不同,不喜技术输出(认为那是翻来覆去的陈词滥调),更偏爱人文关怀和新奇创意,那年与数不清的业界好友畅谈,好似那一整年的春夏秋冬都是热烈的盛夏。 「探寻


Rust 函数与返回值详解:参数、表达式与返回类型
程序员爱钓鱼2026/7/14

《Rust 编程实战》系列第 9 篇 在前面的文章中,我们已经学习了变量、数据类型、常量和静态变量。 接下来,我们需要解决一个非常重要的问题: 如何把一段功能独立出来,并在程序中的多个地方重复使用? 答案就是:函数(Function)。 函数是组织 Rust 程序最基本的方式之一。无论是命令行工具、Web 服务、桌面软件还是企业级项目,最终都会由大量函数共同组成。 本文将详细介绍: 如何定义函数 如何传递参数 如何声明参数类型 如何返回数据 Rust 中语句和表达式的区


认识 Horizon UI · 15/17:用模板定制控制台
SkyWalking中文站2026/7/6

Horizon UI 系列第十五篇:整个控制台都由可编辑模板驱动。你可以把任意 layer 或 overview 打开成模板,在本地草稿里调整组件、widget 和文案,预览后发布到 OAP 给整个组织使用,并在发布前查看差异,也可以导出和导入。 译自英文原文:Meet Horizon UI · 15/17: Customization — Config-Driven Layer Templates。 这是 Meet Horizon UI 系列的第十五篇,也开启第五幕 make it yours


用视频数据采集 API 构建个人视频搜索引擎:从 C 罗频道到 Elasticsearch 全文检索
硬核科技工作室2026/6/28

一、视频元数据好看,但不好稳定拿 做视频搜索、内容监测或者训练数据准备时,第一步通常不是模型,也不是搜索算法,而是先拿到一批质量稳定的视频元数据。 比如我们想做一个个人视频搜索引擎,输入关键词 Cristiano,系统可以返回相关视频的标题、描述、播放量、时长、上传者和视频链接。听起来很简单,但真正做起来会发现,视频平台页面结构经常变化,不同入口返回的信息也不一样:频道页、搜索页、标签页、播放页,每个页面的数据组织方式都不同。 如果自己做这件事,通常会有几种方案。 第一种是自己写数据采集


AI 能写代码了,为什么我反而开始要求它先写文档?
Avan菜菜2026/6/19

最近在尝试用 AI 参与项目开发。 刚开始我的方式很简单: 提需求 ↓ 让 AI 直接实现 ↓ 不断返工 ↓ 继续补需求 结果非常熟悉: 功能能跑 代码越来越多 需求越来越乱 AI 上下文越来越长 后面谁都不敢接手 尤其是涉及: 前后端联动 权限体系 数据结构变更 API 契约 多阶段迭代 时,问题会迅速放大。 后来我接触到了 GitHub 开源的 Spec Kit。 它让我第一次把 AI 开发从: 直接写代码 变成: 先规格 ↓ 再设计 ↓ 再拆任务 ↓ 最后实现 整个过程开始变


企业智能助手的实践分享(LLM/RAG)
uzong2026/6/11

本文聚焦 AI 技术在企业级智能的实践,剖析项目实施过程中的关键挑战与避坑指南。 1. LLM 智能运维助手 1.1. 助手背景 在企业基础设施建设中,开放平台与基础服务承载着海量业务。随着系统复杂度的增加,日常运行中产生了庞大的日志告警数据。面对这些海量且繁杂的告警信息,传统的人工排查模式不仅耗时费力,且难以在“告警风暴”中迅速抽丝剥茧,成为制约研发效率的瓶颈。 希望助手能力致力于解决两大核心难题:一是应对海量日志告警的干扰,二是大幅缩短告警排查的平均耗时。 1.2. 案例效果 下面是一个案例


Linux shell脚本教程
诸神缄默不语2026/6/4

诸神缄默不语-个人技术博文与视频目录 Linux系统的命令行终端界面就是一个小黑窗,在里面敲命令执行任务。当你想执行一系列复杂的任务(比如连续执行多个命令、有逻辑判断规则等)时,光靠直接敲命令+回车就不够了,这时你就会将一系列任务的执行代码写到一个文本文件中,然后让Linux终端依次执行。这个文本文件就是shell脚本。 本文对Linux系统中的shell脚本进行简单介绍,包括其作用和基本写法。更高级的用法将在以后的教程中介绍。 对Linux系统的整体命令行操作教程,请参考我撰写的另一篇博文:


零基础webgis开发入门:HTML/CSS/JavaScript前端核心基础②
GIS6688002026/5/28

CSS:页面样式与布局美化 CSS 全称层叠样式表,核心作用是控制HTML元素的外观和布局,包括大小、颜色、背景、位置、边距等。 在WebGIS中,CSS直接决定地图的显示尺寸、是否全屏、页面是否有白边等关键效果。 CSS的核心逻辑可总结为两步走:选元素、改样式。 第一步:选元素(选择器) 1)什么是选择器: 选择器是CSS的核心,作用是从页面众多HTML元素中,筛选出需要修改样式的目标元素。 想象一群小黄人站你面前,你想把单眼的小黄人选出来变红色。 第一步:选出所


TOML 深度调研:对比 YAML、JSON 等五大配置格式,哪种最适合你的项目?
王若风2026/5/6

大家好,我是若风。 上周在配置一个 Rust 项目的时候,我盯着 Cargo.toml 发了一会儿呆。然后突然意识到一件事:我写了这么多年代码,跟配置文件打交道的时间可能比写业务逻辑还多。package.json、docker-compose.yml、tsconfig.json、.gitignore、terraform.tf……每个项目至少 3 到 5 个配置文件。 但说实话,我从来没认真想过一个问题:为什么这些工具要用不同的配置格式? YAML 写 Kubernetes 配置,JSON 写 p


如何将SVG格式文件转为PDF? 方便打印输出、正式汇报、跨平台展示
诸葛大钢铁2026/4/26

在日常设计、开发与文档交付过程中,SVG转PDF是一个非常高频但容易被忽视的需求。很多人一开始会觉得“只是格式转换而已”,但真正遇到输出打印、正式汇报或跨平台展示时才发现:SVG在不同设备上的兼容性并不总是稳定,而PDF才是更通用、更专业的交付格式。 尤其是在以下场景中,这个需求会变得非常明显: 设计稿需要提交评审或印刷 网页图标或流程图需要归档成标准文件 跨平台传输时避免样式错乱 因此,一个稳定、清晰、无损的SVG转PDF方案就显得非常重要。 一、设计软件直接导出

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读