当前位置: 首页 > java >正文

leetcode_74 搜索二维矩阵

1. 题意

给你一个满足下述两条属性的 m x n 整数矩阵:

  • 每行中的整数从左到右按非严格递增顺序排列。

  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;

否则,返回 false 。

2. 题解

2.1 暴力

逐个判断即可;

时间复杂度O(mn)O(mn)O(mn)

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {for (auto &M: matrix) {for (auto v: M) {if( v == target)return true;}}return false;}
};
2.2 逐行二分

由于一行的数是有序的,因此可以不用完全遍历。

而且二分查找target

时间复杂度O(mlog⁡n)O(m \log n)O(mlogn)

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size();if (0 == m)return false;for (int i = 0;i < m; ++i) {auto it = lower_bound( matrix[i].begin(), matrix[i].end(), target);if ( it != matrix[i].end() && *it == target)return true;}return false;}
};
2.3 整体二分

由于rrr行的最后一个元素是小于r+1r+1r+1行的第一个元素。

我们可以将这个二维数组给看成一个有序的一维数组。

用下标kkk表示原来数组matrix[k/n][k%n]matrix[k/n][k \%n]matrix[k/n][k%n]这个元素,

[0,mn)[0,mn)[0,mn)这个新下标间进行二分。

时间复杂度O(log⁡mn)=O(log⁡m+log⁡n)O(\log mn) = O(\log m + \log n)O(logmn)=O(logm+logn)

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

我们可以二分查找最后一列,找到第一个不小于targettargettarget所在的行。

在对行进行二分,查找最终的targettargettarget值。

时间复杂度O(log⁡m+log⁡n)O(\log m + \log n)O(logm+logn)

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size();if (0 == m)return false;int n = matrix[0].size();int l;int r;l = 0;r = m;// log mwhile ( l < r) {int mid = ((r - l) >> 1) + l;int v = matrix[mid][n - 1];if ( v == target)return true;if ( v > target)r = mid;elsel = mid + 1;}if ( r >= m )return false;int rows = r;//cout << rows << endl;l = 0;r = n;while ( l < r) {int mid = ((r - l) >> 1) + l;//cout << mid << ": " << matrix[rows][mid] << endl;int v = matrix[rows][mid];if ( v == target)return true;if ( v < target)l = mid + 1;else r = mid;}return false;}
};
2.5 二叉搜索树

这个想法来自三叶姐,宫水三叶。

把这样的二维数组想看成以右上角为根节点的二叉搜索树。

当前节点的左边节点必然小于当前节点,

当前节点的下边节点必然大于当前节点。

我们从根开始,如果当前节点大于target,就向左走;

如果当前节点小于target,就向下走。

重复上面的过程,直到超过边界或者找到target

时间复杂度O(m+n)O(m+n)O(m+n)
在这里插入图片描述

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

参考

三叶
leetcode

http://www.xdnf.cn/news/19381.html

相关文章:

  • 通信原理(006)——分贝(dB)超级详细
  • Tomcat 中部署 Web 应用
  • Git 远程仓库操作:推送到远程仓库、拉取远程仓库到本地仓库
  • 软考备考(5)
  • 《以奋斗者为本》读书笔记(上篇:价值管理)
  • 下一波红利:用 #AI编程 闯入小游戏赛道,#看广告变现 模式正在崛起!
  • Ruoyi-vue-plus-5.x第一篇Sa-Token权限认证体系深度解析:1.4 Sa-Token高级特性实现
  • 机器人控制器开发(底层模块)——Rk3588 CAN0调试
  • 检索优化-混合检索
  • Java学习历程17——利用泛型优化自定义动态数组
  • 【70页PPT】WMS助力企业数字化转型(附下载方式)
  • RestTemplate工具类用法总结
  • 如何解决虚拟机异常退出后提示“获取所有权”错误
  • 使用AI大模型Seed1.5-VL精准识别开车接打电话等交通违法行为
  • JC系列串口通信说明
  • 记录一个典型的epoll socket
  • 深度解析Fluss LockUtils类的并发艺术
  • Linux学习----归档和传输文件实用指南
  • Xshell自动化脚本大赛
  • LightGBM(Light Gradient Boosting Machine,轻量级梯度提升机)梳理总结
  • 互联网大厂AI面试:从大模型原理到场景应用的深度解析
  • 【shell】Shell脚本中的if判断条件和文件测试操作符
  • shell编程基础入门-1
  • Spring : 事务管理
  • 深度学习函数
  • 洛谷 P1395 会议 -普及/提高-
  • 一款基于selenium的前端验证码绕过爆破工具
  • java怎么实现根据指标预警的功能
  • C++多态介绍
  • 【Leetcode】17、电话号码的字母组合