从图书馆找书到矩阵搜索:探索二维矩阵中的高效搜索

生活中的搜索策略

想象你在一个大型图书馆里找书。这个图书馆的书架是按照两个维度排列的:每个书架从左到右按书名字母顺序排列,从上到下的书架则按照出版年份排序。如果你要找一本特定的书,你会怎么做?显然,从第一个书架第一本书开始一本本查找是最笨的方法。聪明的做法是:先找到可能的书架(年份范围),再在书架上快速定位(利用字母顺序)。

问题描述

LeetCode第240题"搜索二维矩阵 II"是这样描述的:编写一个程序,在一个 m x n 的矩阵中查找一个值 target。这个矩阵有以下特性:

  • 每行的元素从左到右升序排列
  • 每列的元素从上到下升序排列

例如:

输入: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

最直观的解法:暴力搜索

就像在图书馆里一本本翻找,最简单的方法是遍历矩阵中的每个元素。虽然这种方法保证能找到答案,但效率很低。

暴力搜索的实现

public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return false;
} int m = matrix.length;
int n = matrix[0].length; // 遍历每个元素
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == target) {
return true;
}
}
} return false;
}

优化解法:从右上角开始搜索

仔细观察矩阵的特性,我们可以采用更聪明的方法。就像在图书馆找书时,我们可以站在一个特殊的位置 —— 右上角,这个位置很神奇:

  • 向左看,数字会变小
  • 向下看,数字会变大

这就给了我们一个明确的搜索方向!

右上角搜索的原理

想象你在玩一个猜数字的游戏:

  1. 站在右上角
  2. 如果当前数字大于目标值,就向左移动(因为下面的数字更大,没必要看)
  3. 如果当前数字小于目标值,就向下移动(因为左边的数字更小,没必要看)
  4. 如果相等,就找到了答案

示例运行

以查找target = 9为例:

1  4  7  11 [15] → 比9大,左移
1 4 7 [11] 15 → 比9大,左移
1 4 [7] 11 15 → 比9小,下移
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

Java代码实现

public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return false;
} // 从右上角开始搜索
int row = 0;
int col = matrix[0].length - 1; while (row < matrix.length && col >= 0) {
if (matrix[row][col] == target) {
return true;
} else if (matrix[row][col] > target) {
// 当前值太大,向左移动
col--;
} else {
// 当前值太小,向下移动
row++;
}
} return false;
}

解法比较

让我们比较这两种方法:

暴力搜索:

  • 时间复杂度:O(m×n)
  • 空间复杂度:O(1)
  • 优点:简单直观,容易实现
  • 缺点:没有利用矩阵的特性,效率低

右上角搜索:

  • 时间复杂度:O(m+n)
  • 空间复杂度:O(1)
  • 优点:充分利用矩阵特性,高效快速
  • 缺点:需要理解矩阵的排序特性

实用技巧总结

解决矩阵搜索问题的关键点:

  1. 观察矩阵的特性(如排序规律)
  2. 寻找特殊位置(如右上角)作为起点
  3. 利用排序特性确定搜索方向
  4. 正确处理边界条件

相关的矩阵搜索问题:

  • 搜索二维矩阵 I
  • 有序矩阵中的第k小元素
  • 矩阵中的最小路径和

小结

通过搜索二维矩阵这道题,我们学会了如何在有序矩阵中高效搜索。这种思维方式不仅能解决算法题,在数据库索引设计、图像处理等领域都有应用。记住,当遇到需要在有序数据结构中搜索的问题时,可以考虑利用数据的有序性来优化搜索过程,通常能获得比暴力搜索更好的性能!


作者:忍者算法

公众号:忍者算法

我准备了一份刷题清单,以及这些题目的详细题解,覆盖了绝大部分常见面试题。我可以很负责任地说,只要你把这些题真正掌握了,80%的算法面试都能遇到相似题目。公众号回复【刷题清单】获取~

【忍者算法】从图书馆找书到矩阵搜索:探索二维矩阵中的高效搜索|LeetCode第240题 搜索二维矩阵 II的更多相关文章

  1. 剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计算法找其中的一个数

    题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 2 4 9 12 4 7 10 13 6 8 11 ...

  2. 每周荐书:云原生、Docker、Web算法(评论送书)

    每周荐书:云原生.Docker.Web算法(评论送书) 感谢大家对每周荐书栏目的支持,先公布下上周中奖名单 名优秀评论可以免费获得此书.   云原生应用架构实践 云原生架构,关注简化开发流程.提升研发 ...

  3. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  4. 机器学习实战基础(二十三):sklearn中的降维算法PCA和SVD(四) PCA与SVD 之 PCA中的SVD

    PCA中的SVD 1 PCA中的SVD哪里来? 细心的小伙伴可能注意到了,svd_solver是奇异值分解器的意思,为什么PCA算法下面会有有关奇异值分解的参数?不是两种算法么?我们之前曾经提到过,P ...

  5. Linux运维之道(大量经典案例、问题分析,运维案头书,红帽推荐)

    Linux运维之道(大量经典案例.问题分析,运维案头书,红帽推荐) 丁明一 编   ISBN 978-7-121-21877-4 2014年1月出版 定价:69.00元 448页 16开 编辑推荐 1 ...

  6. 找不到类型{0} 它在 ServiceHost 指令中提供为 Service 特性值

    由于我把binding改成wsHttpBinding,在web.config里也改了命名空间 services的类名也改成了跟 web.config对应的命名空间后 在添加引用后,出现了错误: “找不 ...

  7. 算法题 19 二叉平衡树检查 牛客网 CC150

    算法题 19 二叉平衡树检查 牛客网 CC150 实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1. 给定指向树根结点的指针TreeNode* ro ...

  8. 剑指Offer(书):二维数组中的查找

    题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  9. LeetCode 第70题动态规划算法

    导言 看了 动态规划(https://www.cnblogs.com/fivestudy/p/11855853.html)的帖子,觉得写的很好,记录下来. 动态规划问题一直是算法面试当中的重点和难点, ...

  10. ORACLE中如何找出大表分布在哪些数据文件中?

    ORACLE中如何找出大表分布在哪些数据文件中?   在ORACLE数据中,我们能否找出一个大表的段对象分布在哪些数据文件中呢? 答案是可以,我们可以用下面脚本来找出对应表的区.段分别位于哪些数据文件 ...

随机推荐

  1. Linux终端命令之screen

    screen的功能 screen的功能大体有三个: 会话恢复:只要Screen本身没有终止,在其内部运行的会话都可以恢复.这一点对于远程登录的用户特别有用--即使网络连接中断,用户也不会失去对已经打开 ...

  2. YAML语法基础

    YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言). YAML 的语法和其他高级语言类似,并且可以简单表达清单.散列表,标量等数 ...

  3. AI工具推荐——Cherry Studio

    Cherry Studio介绍 Cherry Studio是一款支持多模型服务的 Windows/macOS GPT 客户端. 它的主要特点如下: 多样化的大型语言模型提供商支持 ️ 主要的大型语言模 ...

  4. PTA-1002

    原先主要错误: 没有考虑到有关0的相关情况 观看的大佬代码 整理思路 无非就是在相同的指数的情况下,系数相加 因为最后是要从大到小输出来. 注意 要对最后的结果进行四舍五入: PTA的英语题对英语不好 ...

  5. 圆梦:借助云开发 CloudBase实现你的游戏开发梦想

    最近我发现AI产品在不断涌现新动向,尤其是一些技术巨头推出的创新产品.例如,今天我们要探讨的是腾讯云开发的云开发 CloudBase,如果你之前没有听说过这个名字,那可能还记得腾讯云推出的另一个产品- ...

  6. [转载] 十问 TiDB :关于架构设计的一些思考 TiDB

    做 TiDB 的缘起是从思考一个问题开始的:为什么在数据库领域有这么多永远也躲不开的坑?从 2015 年我们写下第一行代码,3 年以来我们迎面遇到无数个问题,一边思考一边做,尽量用最小的代价来快速奔跑 ...

  7. Maven 插件 git-commit-id-plugin,打包包含提交信息

    Maven打包发布版本可能会遇到自己的提交不起作用的情况,排查比较困难,可能需要拉下服务器上包,反编译查看是否包含自己的提交记录.如果使用的是GIT作为SCM,可以使用 git-commit-id-p ...

  8. Mac idea 打不开

    从官网上刚下载的idea,安装完成之后,双击打开,只见一闪而过,软件没有打开. 打开 访达->应用程序->IntelliJ IDEA ->显示包内容 :   image.png 显示 ...

  9. SpringBoot支持Kafka多源配置的同时还要支持启停配置化,是真的会玩

    开心一刻 今早,女朋友给我发微信 她:宝贝,你要记住 她:我可是你女朋友,你相亲就亲,想抱就抱 她:不要老是问我,男生要主动一些 我:可是你上次报警可不是这么说的 基础回顾 Spring Boot 集 ...

  10. Qt音视频开发37-识别鼠标按下像素坐标

    一.前言 在和视频交互过程中,用户一般需要在显示视频的通道上点击对应的区域,弹出对应的操作按钮,将当前点击的区域或者绘制的多边形区域坐标或者坐标点集合,发送出去,通知其他设备进行处理.比如识别到很多人 ...