【面试经典150 | 二分查找】搜索二维矩阵

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:二分查找
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【二分查找】【数组】


题目来源

74. 搜索二维矩阵


题目解读

在二维矩阵中查找指定值,如果存在返回 true,否则返回 false。


解题思路

方法一:二分查找

二维矩阵每行是有序的,每一行的第一个整数都是大于上一行的最后一个整数的,那么吧二维矩阵 “拉直” 形成一维数组,这个数组也是有序的,那么本题就转化为在有序数组中判断是否存在指定值,妥妥的可以使用二分查找来完成。

“拉直” 指的是将矩阵按行进行拼接,得到一个一维数组,下标为二维坐标与一维数的一一映射的值。比如二维矩阵第 i 行第 j 列用 i * m + jm 为二维矩阵的列数)来表示,对应的知道一维的值 x 可以求出对应的二维矩阵的坐标 (x / m, x % m)

接着在一维数组中进行二分查找即可:

  • 初始化指针 l = 0, r = m * n - 1
  • l <= r 时,进行 while 循环判断,当前的二分中点 mid = (r - l) / 2 + l,对应二维矩阵中的值为 x = matrix[mid / m][mid % m]
    • 如果 x < target,更新 l = mid + 1
    • 如果 x > target,更新 r = mid - 1
    • 否则说明查找到 target,直接返回 true
  • 如果退出 while 循环仍然没有找到 target,直接返回 false

实现代码

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int n = matrix.size(), m = matrix[0].size();int l = 0, r = m * n - 1;int mid;while(l <= r){mid = (l + r) >> 1;int x = matrix[mid / m][mid % m];if(target > x){l = mid + 1;}else if(target < x){r = mid - 1;}else{return true;}}return false;}
};

复杂度分析

时间复杂度: O ( n m ) O(nm) O(nm) n n n m m m 分别为二维矩阵的高度和宽度。

空间复杂度: O ( 1 ) O(1) O(1)


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

【Unity动画】Unity 动画播放的流程

本文以2D为案例&#xff0c;讲解Unity 播放动画的流程 准备和导入2D动画资源 外部导入序列帧生成的 Unity内部制作的 外部导入的3D动画 2.创建动画过程 打开时间轴Ctrl6 选中场景中的一个未来需要播放动画的物体 回到时间轴点击Create一个新动画片段 拖动2D动画资源放入…

Redis数据库

服务器结构 struct redisServer {/* General */pid_t pid; /* Main process pid. */pthread_t main_thread_id; /* Main thread id */char *configfile; /* Absolute config file path, or NULL */char *executable; /* Absolut…

科研小白必收藏,手把手教你写医学论文!

一篇完整的论文应包括标题、摘要、引言、方法、结果、讨论、致谢、参考文献八个部分&#xff0c;每个部分的写作都有技巧。 1.标题 标题一般采用名词词组或名词短语的形式&#xff0c;个别杂志也允许陈述句的形式。标题必须简单、明了&#xff0c;醒目。题目要新颖&#xff0c…

分享74个节日PPT,总有一款适合您

分享74个节日PPT&#xff0c;总有一款适合您 74个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/18YHKkyJsplx-Gjj7ofpFrg?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

quickapp_快应用_父子组件传值

目录 页面级组件自定义组件(子组件)引入自定义组件(子组件)父组件给子组件传值子组件给父组件进行传值父组件调用子组件的方法 页面级组件 在pages中定义的组件被称为页面级组件。 页面级组件(等同于Vue页面)&#xff0c;通过路由配置可以进行页面跳转。 自定义组件(子组件)…

JS学习--类型转换

函数转换 parseInt() 转换之前&#xff0c;首先会分析该字符串。判断位置为0处的字符串&#xff0c;判断是否为有效数字&#xff0c;若否&#xff0c;直接返回NaN&#xff0c;不再继续&#xff1b; 若是&#xff0c;继续打印直到不为数字的地方停止 parseFloat() 转换之前&…

TA-Lib学习研究笔记(三)——Volatility Indicator

TA-Lib学习研究笔记&#xff08;三&#xff09;——Volatility Indicator 波动率指标函数组 Volatility Indicators: [‘ATR’, ‘NATR’, ‘TRANGE’] 1.ATR Average True Range 函数名&#xff1a;ATR 名称&#xff1a;真实波动幅度均值 简介&#xff1a;真实波动幅度均值…

CRM选型:避免盲目跟风,要选最适合自己的!

CRM系统品牌繁多&#xff0c;各有优劣。对CRM系统不够了解的企业该如何选到适合的CRM系统&#xff1f;针对这个问题&#xff0c;我们就来聊聊&#xff0c;如何判定CRM系统是否适合自身企业&#xff1f; 一、综合性 CRM系统应该具有很好的综合性能&#xff0c;能够管理客户的整…

操作系统:进程调度算法(FCFS、SJF、HRRN、RR、HPF、MFQ)

进程调度算法也称 CPU 调度算法&#xff0c;毕竟进程是由 CPU 调度的。 非抢占式调度&#xff1a;当进程正在运行时&#xff0c;它就会一直运行&#xff0c;直到该进程完成或发生某个事件而被阻塞时&#xff0c;才会把 CPU 让给其他进程。抢占式调度&#xff1a;进程正在运行的…

离线数仓构建案例一

数据采集 日志数据&#xff08;文件&#xff09;到Kafka 自己写个程序模拟一些用户的行为数据&#xff0c;这些数据存在一个文件夹中。 接着使用flume监控采集这些文件&#xff0c;然后发送给kafka中待消费。 1、flume采集配置文件 监控文件将数据发给kafka的flume配置文件…

JAVAEE初阶相关内容第十六弹--网络原理之TCP_IP

目录 1. TCP-IP五层模型 2. UDP协议 2.1 特点 2.2 UDP协议端格式 2.3 校验和 3. TCP协议 3.1 特点 3.2 TCP协议段格式 3.2.1 首部长度 3.2.2 选项 3.2.3 保留6位 3.3 TCP内部的工作机制 3.3.1 确认应答 &#xff08;1&#xff09;应答报文ack &#xff08;2&…

Redis5新特性-stream

Stream队列 Redis5.0 最大的新特性就是多出了一个数据结构 Stream&#xff0c;它是一个新的强大的 支持多播的可持久化的消息队列&#xff0c;作者声明 Redis Stream 地借鉴了 Kafka 的设计。 生产者 xadd 追加消息 xdel 删除消息&#xff0c;这里的删除仅仅是设置了标志位&am…