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

LeetCode[中等] 74.搜索二维矩阵

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

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

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

public class Solution {public bool 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 = low + (high - low) / 2;int row = mid / n , column = mid % n;if(matrix[row][column] == target)return true;else if(matrix[row][column] > target)high = mid -1;elselow = mid + 1;}return false;}
}

思路:m 行 n 列的矩阵可以转换成长度为 mn 的升序数组。矩阵中的每个位置可以和升序数组中的下标转换:

  • 当 0≤i<m 且 0≤j<n 时,矩阵的第 i 行第 j 列等价于升序数组的下标 i×n+j;

  • 当 0≤index<mn 时,升序数组的下标 index 等价于矩阵的第 ⌊nindex​⌋ 行第 index mod n 列。

为了判断矩阵中是否存在目标值,可以在矩阵转换成的升序数组中二分查找。

复杂度分析

代码

测试用例

测试结果

测试结果

全部题解

74. 搜索二维矩阵

Storm

Guardian

关注

242

2022.06.11

发布于 上海

数组

二分查找

矩阵

C

6+

解法

思路和算法

由于给定的矩阵满足每行升序排序,且每行的第一个整数大于前一行的最后一个整数,因此如果将矩阵的每一行拼接到前一行的末尾,可以得到一个升序数组,m 行 n 列的矩阵可以转换成长度为 mn 的升序数组。矩阵中的每个位置可以和升序数组中的下标转换:

  • 当 0≤i<m 且 0≤j<n 时,矩阵的第 i 行第 j 列等价于升序数组的下标 i×n+j;

  • 当 0≤index<mn 时,升序数组的下标 index 等价于矩阵的第 ⌊nindex​⌋ 行第 indexmodn 列。

为了判断矩阵中是否存在目标值,可以在矩阵转换成的升序数组中二分查找。

用 low 和 high 分别表示二分查找的下标范围的下界和上界,初始时 low=0,high=mn−1。每次查找时,取 mid 为 low 和 high 的平均数向下取整,计算下标 mid 对应的矩阵行下标和列下标,判断矩阵中的相应位置的数和目标值的大小关系,调整查找的下标范围。

  • 如果矩阵中相应位置的数等于 target,则找到目标值,返回 true。

  • 如果矩阵中相应位置的数大于 target,则如果目标值存在,其下标一定小于 mid,因此在下标范围 [low,mid−1] 中继续查找。

  • 如果矩阵中相应位置的数小于 target,则如果目标值存在,其下标一定大于 mid,因此在下标范围 [mid+1,high] 中继续查找。

如果查找的过程中出现 low>high,则目标值不存在,返回 false。

代码

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 = low + (high - low) / 2;int row = mid / n, column = mid % n;if (matrix[row][column] == target) {return true;} else if (matrix[row][column] > target) {high = mid - 1;} else {low = mid + 1;}}return false;}
}

复杂度分析

  • 时间复杂度:O(log(mn)),其中 m 和 n 分别是矩阵 matrix 的行数和列数。矩阵中的元素个数是 mn,二分查找的次数是 O(log(mn)),每次查找的时间是 O(1),时间复杂度是 O(log(mn))。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Flask-Migrate的使用
  • 网络安全实训八(y0usef靶机渗透实例)
  • 9.17日常记录
  • JavaEE:网络编程(套接字)
  • [Meachines] [Medium] Bart Server Monitor+Internal Chat+UA投毒+Winlogon用户密码泄露权限提升
  • 线性代数书中求解线性方程组的三种方法的实例
  • TESSY创建以及设计一个测试用例
  • 英文ai写作怎么写?5个软件帮助你轻松进行ai写作
  • 9.18学习记录
  • C++:日期类的实现
  • 20240918 每日AI必读资讯
  • GEE教程:1950-2023年ECMWF数据中积雪的长时序统计分析
  • MySQL学习(视图总结)
  • 安卓将本地日志上传到服务器
  • 高效容器化技术(1)---容器化技术简介
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • CSS实用技巧
  • C学习-枚举(九)
  • JAVA多线程机制解析-volatilesynchronized
  • Java基本数据类型之Number
  • Less 日常用法
  • Linux gpio口使用方法
  • Meteor的表单提交:Form
  • MySQL数据库运维之数据恢复
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • React-Native - 收藏集 - 掘金
  • Sass Day-01
  • uva 10370 Above Average
  • Vue UI框架库开发介绍
  • 从零搭建Koa2 Server
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 聊聊flink的TableFactory
  • 前端技术周刊 2019-02-11 Serverless
  • 前端性能优化--懒加载和预加载
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 实现简单的正则表达式引擎
  • 应用生命周期终极 DevOps 工具包
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • (2015)JS ES6 必知的十个 特性
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (js)循环条件满足时终止循环
  • (SERIES12)DM性能优化
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (十)c52学习之旅-定时器实验
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .gitignore不生效的解决方案
  • .net 7 上传文件踩坑
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET delegate 委托 、 Event 事件
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .net 流——流的类型体系简单介绍
  • .NET6 开发一个检查某些状态持续多长时间的类