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

搜索二维矩阵[中等]

一、题目

给你一个满足下述两条属性的m x n整数矩阵:
【1】每行中的整数从左到右按非严格递增顺序排列。
【2】每行的第一个整数大于前一行的最后一个整数。

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

示例 1:

输入: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出: true

示例 2:

输入: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出: false

m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104

二、代码

【1】两次二分查找: 由于每行的第一个元素大于前一行的最后一个元素,且每行元素是升序的,所以每行的第一个元素大于前一行的第一个元素,因此矩阵第一列的元素是升序的。

我们可以对矩阵的第一列的元素二分查找,找到最后一个不大于目标值的元素,然后在该元素所在行中二分查找目标值是否存在。

class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length, n = matrix[0].length;int low = 0, high = m * n - 1;while (low <= high) {int mid = (high - low) / 2 + low;int x = matrix[mid / n][mid % n];if (x < target) {low = mid + 1;} else if (x > target) {high = mid - 1;} else {return true;}}return false;}
}

时间复杂度: O(log ⁡m+log ⁡n)=O(log ⁡mn),其中mn分别是矩阵的行数和列数。
空间复杂度: O(1)

【2】一次二分查找: 若将矩阵每一行拼接在上一行的末尾,则会得到一个升序数组,我们可以在该数组上二分找到目标元素。代码实现时,可以二分升序数组的下标,将其映射到原矩阵的行和列上。

class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length, n = matrix[0].length;int low = 0, high = m * n - 1;while (low <= high) {int mid = (high - low) / 2 + low;int x = matrix[mid / n][mid % n];if (x < target) {low = mid + 1;} else if (x > target) {high = mid - 1;} else {return true;}}return false;}
}

时间复杂度: O(log⁡mn),其中mn分别是矩阵的行数和列数。
空间复杂度: O(1)

两种方法殊途同归,都利用了二分查找,在二维矩阵上寻找目标值。值得注意的是,若二维数组中的一维数组的元素个数不一,方法二将会失效,而方法一则能正确处理。

相关文章:

  • 【Linux】Linux下的基本指令
  • Android AOSP源码研究之万事开头难----经验教训记录
  • C++学习Day03之new和delete使用
  • 如何实现视线(目光)的检测与实时跟踪
  • JavaGuide
  • Huggingface上传模型
  • C# CAD交互界面-自定义面板集-添加快捷命令(五)
  • three.js 箭头ArrowHelper的实践应用
  • Peter算法小课堂—单调队列
  • SQL Server数据库日志查看若已满需要清理的三种解决方案
  • C#系列-C#操作UDP发送接收数据(10)
  • linux系统haproxy负载均衡工具的介绍以及使用
  • ShardingSphere实现openGauss分布式架构
  • JavaScript实现轮播图方法
  • 【机器学习】数据清洗之识别异常点
  • 分享的文章《人生如棋》
  • 《Java编程思想》读书笔记-对象导论
  • 【node学习】协程
  • angular2 简述
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • co模块的前端实现
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • LintCode 31. partitionArray 数组划分
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Node项目之评分系统(二)- 数据库设计
  • PHP 的 SAPI 是个什么东西
  • Web标准制定过程
  • 半理解系列--Promise的进化史
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 关于List、List?、ListObject的区别
  • 排序算法学习笔记
  • 前端代码风格自动化系列(二)之Commitlint
  • python最赚钱的4个方向,你最心动的是哪个?
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • # include “ “ 和 # include < >两者的区别
  • ###项目技术发展史
  • #DBA杂记1
  • #Ubuntu(修改root信息)
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (33)STM32——485实验笔记
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二)WCF的Binding模型
  • (三)docker:Dockerfile构建容器运行jar包
  • (未解决)macOS matplotlib 中文是方框
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • . Flume面试题
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net反编译的九款神器