news 2026/5/12 21:16:51

【力扣100题】25. 搜索二维矩阵 II

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【力扣100题】25. 搜索二维矩阵 II

一、题目描述

编写一个高效的算法来搜索 m x n 矩阵 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

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= n, m <= 300
  • -10^9 <= matrix[i][j] <= 10^9
  • 每行的所有元素从左到右升序排列
  • 每列的所有元素从上到下升序排列
  • -10^9 <= target <= 10^9

二、解题思路总览

核心思想:从右上角开始,利用有序性单向剪枝

从矩阵的右上角开始搜索,每次比较后根据大小关系排除一行或一列:

  • 如果当前元素大于 target,说明目标不可能在当前列的下方,往左走
  • 如果当前元素小于 target,说明目标不可能在当前行的上方,往下走

为什么从右上角或左下角开始?

因为这两个角具有「单向有序」的特性:

  • 右上角:同行左边更小,同列下边更大
  • 左下角:同行右边更大,同列上边更小

从其他角落开始无法保证单向剪枝。

方法核心思路时间复杂度空间复杂度
搜索窗口法(本题)从右上角开始,每次排除一行或一列O(m + n)O(1)
二分搜索对每行进行二分O(m log n)O(1)
暴力搜索遍历整个矩阵O(m * n)O(1)

三、完整代码

classSolution{public:boolsearchMatrix(vector<vector<int>>&matrix,inttarget){intm=matrix.size();intn=matrix[0].size();intl=0;// 当前行,从 0 开始intb=n-1;// 当前列,从最后一列开始(右上角)while(l<m&&b>=0){if(matrix[l][b]==target){returntrue;}if(matrix[l][b]>target){b--;// 当前元素太大,目标在左边,列减一}elseif(matrix[l][b]<=target){l++;// 当前元素太小,目标在下边,行加一}}returnfalse;}};

四、算法流程图

4.1 整体搜索流程

输入:matrix, target [Step 1] 初始化起点 l = 0(从第一行开始) b = n - 1(从最后一列开始,即右上角) | v [Step 2] 进入主循环 | v l < m && b >= 0 ? |否 v 【返回 false】 ← 循环结束,未找到 | |是 v [Step 3] 获取当前元素 current = matrix[l][b] | v current == target ? |是 v 【返回 true】 ← 找到目标 | |否 v current > target ? |是 |否 v v [Step 4] 列左移 [Step 5] 行下移 | | v v b-- l++ | | v v 回到 Step 2 回到 Step 2

4.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 = 5 初始:l=0, b=4 第一轮: matrix[0][4] = 15 > 5 → b-- → b=3 第二轮: matrix[0][3] = 11 > 5 → b-- → b=2 第三轮: matrix[0][2] = 7 > 5 → b-- → b=1 第四轮: matrix[0][1] = 4 < 5 → l++ → l=1 第五轮: matrix[1][1] = 5 == 5 → 返回 true 找到目标!共执行 5 步。

4.3 具体示例执行流程(未找到目标)

输入:target = 20 初始:l=0, b=4 第一轮:matrix[0][4] = 15 < 20 → l++ → l=1 第二轮:matrix[1][4] = 19 < 20 → l++ → l=2 第三轮:matrix[2][4] = 22 > 20 → b-- → b=3 第四轮:matrix[2][3] = 16 < 20 → l++ → l=3 第五轮:matrix[3][3] = 17 < 20 → l++ → l=4 第六轮:matrix[4][3] = 26 > 20 → b-- → b=2 第七轮:matrix[4][2] = 23 > 20 → b-- → b=1 第八轮:matrix[4][1] = 21 > 20 → b-- → b=0 第九轮:matrix[4][0] = 18 < 20 → l++ → l=5 第十轮:l=5 不满足 l < m,循环退出 返回 false(未找到)

4.4 为什么从右上角开始

以 4x4 矩阵为例: col=0 col=1 col=2 col=3 row=0 1 2 3 4 row=1 5 6 7 8 row=2 9 10 11 12 row=3 13 14 15 16 右上角 (l=0, b=3) = 4 特性: - 往左走(b--):值变小(同行左边元素更小) - 往下走(l++):值变大(同列下方元素更大) 这保证了每次比较后只能往一个方向走,不会丢失任何可能性。 如果从左上角开始 (l=0, b=0) = 1: - 往右走(b++):值变大 - 往下走(l++):值变大 两个方向都可能导致 target,无法剪枝。

五、逐行解析

5.1 初始化起点

intl=0;// 当前行intb=n-1;// 当前列(右上角)

选择右上角的原因:

  • 同行左侧都是比它小的元素(往左走值变小)
  • 同列下方都是比它大的元素(往下走值变大)
  • 形成天然的搜索剪枝条件

5.2 主循环逻辑

while(l<m&&b>=0){if(matrix[l][b]==target){returntrue;}if(matrix[l][b]>target){b--;}elseif(matrix[l][b]<=target){l++;}}

三种情况:

情况条件动作原因
找到目标matrix[l][b] == targetreturn true搜索成功
当前太大matrix[l][b] > targetb–同行左边更小,目标可能在左边
当前太小matrix[l][b] < targetl++同列下方更大,目标可能在下方

5.3 循环结束条件

returnfalse;

何时返回 false:

  • l >= m:已经越过最后一行(第 m 行不存在)
  • b < 0:已经越过第一列(第 -1 列不存在)
  • 两种情况都说明已经搜索完所有可能的路径

六、复杂度分析

指标复杂度说明
时间复杂度O(m + n)每次循环要么 l++,要么 b–,最多走 m+n 步
空间复杂度O(1)只用了两个指针变量

最坏情况演示:

m=5, n=5 的矩阵,最多走 5+5-1=9 步: l 从 0 到 4(5 步) b 从 4 到 0(4 步)

七、面试追问

问题回答要点
为什么从右上角开始而不是左上角?左上角往右往下都变大,无法单向剪枝;右上角同行往左更小,同列往下更大
可以从左下角开始吗?可以,逻辑相同:当前太大往上走(行减),当前太小往右走(列加)
时间复杂度为什么是 O(m+n)?每次循环 l++ 或 b–,最多 m+n 步
如果 target 小于矩阵右上角?从右上角开始,直接 b-- 向左搜索,直到找到或越界
为什么不用二分搜索?每行每列虽然有序,但不是全局有序,二分只能作用在单行或单列上
最坏情况下搜索多少次?m+n-1 次,即沿着对角线走完整个矩阵
如果 target 大于矩阵右下角?从右上角开始,一路 l++ 向下搜索,直到找到或越界
为什么是 <= 而不是 <?当 matrix[l][b] < target 时行加一,等于 target 时在第一个 if 已经返回,else if 用 <= 或 < 等价

八、相关题目

题号题目关键点
240搜索二维矩阵 II本题
74搜索二维矩阵每行每列升序,但第一行最后一个元素的右边不再有更小的值
378有序矩阵中第 K 小的元素堆或二分搜索
54螺旋矩阵矩阵遍历

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 21:16:26

全球制造业格局重塑:从成本竞争到价值创新的转型之路

1. 从斯图加特的一场会议说起&#xff1a;西方制造业的十字路口十多年前&#xff0c;我坐在德国斯图加特世界制造业论坛的会场里&#xff0c;空气中弥漫着一种复杂的情绪——焦虑与决心交织。窗外是孕育了保时捷和戴姆勒的工业腹地&#xff0c;窗内则是来自欧美政商界的精英&am…

作者头像 李华
网站建设 2026/5/12 21:16:06

KLayout开源版图工具:芯片设计的完整解决方案

KLayout开源版图工具&#xff1a;芯片设计的完整解决方案 【免费下载链接】klayout KLayout Main Sources 项目地址: https://gitcode.com/gh_mirrors/kl/klayout 你是否曾经在芯片设计过程中遇到过这些困扰&#xff1f;商业版图工具价格昂贵&#xff0c;个人开发者难以…

作者头像 李华
网站建设 2026/5/12 21:09:14

【紧急更新】Google官方刚推送的Veo 2 v2.3.1补丁深度解析:新增胶片扫描模拟、物理光晕建模与导演模式(Director Mode)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Google Veo 2 v2.3.1补丁核心特性概览 Google Veo 2 v2.3.1 补丁是面向视频生成模型推理优化与安全增强的关键更新&#xff0c;聚焦于低延迟部署、多模态对齐稳定性及合规性强化。该版本并非架构重构&a…

作者头像 李华
网站建设 2026/5/12 21:03:59

为开源项目Hermes Agent配置Taotoken作为自定义模型供应商

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为开源项目Hermes Agent配置Taotoken作为自定义模型供应商 对于使用 Hermes Agent 框架构建 AI 应用的开发者而言&#xff0c;能够…

作者头像 李华
网站建设 2026/5/12 21:02:03

2026最新AI大模型学习路线:(非常详细)AI大模型学习路线

本文提供了一套系统化的AI大模型学习路线图&#xff0c;从打好数学与编程基础&#xff0c;到入门机器学习、深入深度学习&#xff0c;再到探索大模型和进阶应用。文章推荐了丰富的学习资源&#xff0c;包括经典书籍、在线课程、实践项目和开源平台&#xff0c;帮助读者全面掌握…

作者头像 李华
网站建设 2026/5/12 21:00:44

Claude模型深度集成IDE:claudecode项目架构与工程实践全解析

1. 项目概述&#xff1a;当Claude遇上代码编辑器最近在开发者圈子里&#xff0c;一个名为grickme/claudecode的项目开始被频繁提及。乍一看这个名字&#xff0c;你可能和我最初的反应一样&#xff1a;这又是一个基于某个大语言模型的代码生成工具&#xff1f;但当我真正上手体验…

作者头像 李华