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

news/2025/2/12 1:17:41/文章来源:https://www.cnblogs.com/renzhesuanfa/p/18710817

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

生活中的搜索策略

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

问题描述

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%的算法面试都能遇到相似题目。公众号回复【刷题清单】获取~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/882364.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

容器附加存储CAS之OpenEBS快速入门

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.CAS之OpenEBS存储机制概述1.什么是CAS2.什么是OpenEBS3.OpenEBS数据引擎4.NDM(Node Disk Manager)5.部署OpenEBS的基本流程二.部署OpenEBS 一.CAS之OpenEBS存储机制概述 1.什么是CAS Kubernetes的卷…

【CodeForces训练记录】Codeforces Round 1004 (Div. 2)

训练情况赛后反思 这场太神奇了,都在和出题人对脑电波,全是智慧题 A题 我们考虑进位的情况,例如 9999 之类的,我们发现进位对答案的影响只有 \(x - 9k + 1 = y\),判断 \(k\) 是否存在非负整数解即可点击查看代码 #include <bits/stdc++.h> // #define int long long…

短信验证码爆破

漏洞原理 短信验证码验证时间和次数无限制,存在爆破可能 短信验证码有效期:5~10min,验证码位数4位或6位,纯数字 破解方式:使用枚举逐个尝试 使用BP爆破短信验证码可以先用已有手机号确认验证码位数2.发送验证码后将验证码输入,然后登陆抓包后续和爆破操作一致如果字典太大…

【洛谷P1955】程序自动分析[NOI2015]

今天开始学习并查集 什么是并查集呢?顾名思义,就是动态维护一个方便进行合并和查找的集合 我们采用的是树状结构 也就是说,对于一开始的每个元素 它的爸爸是它自己 然后在输入两个元素的从属关系的时候,通过路径压缩,把它的爸爸直接连到根节点 因为我们只关心这个元素在这…

chorme 系统代理设置

https 需要证书 1.使用BurpSuite导出CA证书,文件导出到本地2. 谷歌浏览器添加证书 谷歌浏览器->设置->搜索"证书"->安全->管理证书->管理从windows导入的证书->受信任的根证书颁发机构->导入第一步的证书3.设置系统代理 windows系统->设置-…

picachu 越权漏洞

1. 水平越权 1.查看提示信息,提供了3个普通用户2. 登陆其中一个账户,并查看个人信息3.根据url 可以看出有用户名信息,尝试在URL中更改其他账户名,发现查看到其他用户的信息4.再次点击查看个人信息按钮,信息更改为已登陆的用户的信息5. 查看源代码发现第27行username 的值是…

windows使用Makefile时自动给可执行文件加上.exe后缀

APP := main在使用makefile的时候,一般通过变量设置自己想要编译出来的可执行文件的名字在windows平台编译出来的可执行文件是需要.exe后缀的识别当前操作系统 通过识别当前的操作系统是什么,从而确定是否添加这个后缀在windows系统中,有这个环境变量说明自己的系统是windows而…

pikachu 验证码绕过 onclient

前端生成的验证码,无论验证码是否正确,都不影响发送到服务器结果(刷新验证码不会通过BP,没有对应的请求出现) 前端验证码逻辑:输入账号密码验证码,如果验证码正确,数据将发送给服务器;如果验证码不正确,数据不会发送给服务器 1.查看页面源代码,发现是前端生成验证码…

图片验证码绕过(验证码不失效) - 使用验证码识别插件

使用BP抓包,抓到的包没有验证码请求添加过滤图片,出现图片验证码请求包添加captcha-killer-modified 插件,识别图片验证码验证码识别服务按照下面链接操作 https://www.cnblogs.com/mr-ryan/p/17812482.html 文档中的ocr_api_server 使用这个链接:https://gitee.com/yijing…

弱口令暴力破解

使用vulhub/tomcat/tomcat8 靶场点击Manager App按钮,提示登陆,输入用户名密码通过BP抓取提交用户名密码的请求报文,获取Authorization信息将Authorization 发送到解码器解码 ,使用Base64 解码成功(一般Base64 编码最后会带= 或者 ==), 解码后知道了发送的密码规则添加Aut…

攻防世界-RE-CatFly

我们将文件拖入虚拟机中运行看到这样的效果 其中上方的数字是不停变化的,下面的次数也在不断的增长。我们猜测这两者是有关联的。 接下来我们进行反编译程序的分析。最上面的字符输出肯定是与printf函数有关,所以我们检索printf在main函数中的调用time(&timer);v13 = 1;v…

Maui 内嵌网页直接调用本机原生功能 Demo

使用 MAUI 制作 H5 套壳程序有以下几个好处:跨平台支持:MAUI (Multi-platform App UI) 允许开发者在多个平台(如 iOS、Android、Windows 和 macOS)上运行应用程序。统一封装的MauiPlus库可以统一调用本机功能,确保在不同平台上有一致的用户体验。访问本地功能:MauiPlus库…