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

[Java恶补day24] 74. 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵:
每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 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
− 10 4 -10^4 104 <= matrix[i][j], target <= 10 4 10^4 104


知识点:
数组、矩阵、二分查找、排除法


解1(非常暴力):
核心思想:定义辅助数组存储所有元素(因为每一行的第一个元素大于上一行的最后一个元素,因此可以这么操作),然后对这个辅助数组进行二分查找

时间复杂度: O ( m n ) O(mn) O(mn)
空间复杂度: O ( m n ) O(mn) O(mn)

class Solution {public boolean searchMatrix(int[][] matrix, int target) {//获取行数、列数int m = matrix.length;int n = matrix[0].length;//定义辅助数组,存储所有元素int[] nums = new int[m * n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {nums[i * n + j] = matrix[i][j];}}//定义二分查找的指针int low = 0;int high = m * n - 1;//只要两个指针不重合,就继续循环while (low <= high) {//获取中位数int mid = (low + high) / 2;//判断是否存在if (nums[mid] == target) {return true;} else if (nums[mid] > target) {high = mid - 1;} else {low = mid + 1;}}//未找到return false;}
}

解2(排除法):
核心思想:同 #240. 搜索二维矩阵Ⅱ

时间复杂度: O ( m + n ) O(m+n) O(m+n)
空间复杂度: O ( 1 ) O(1) O(1)。未使用辅助数组,仅使用int类型的辅助变量。

class Solution {public boolean searchMatrix(int[][] matrix, int target) {//获取行数、列数int m = matrix.length;int n = matrix[0].length;//从右上角开始找int i = 0;int j = n - 1;//只要还有元素,就继续循环while (i < m && j >= 0) {//找到元素,返回if (matrix[i][j] == target) {return true;}//若当前元素>target,则遍历前面一列else if (matrix[i][j] > target) {j--;}//否则,遍历下面一行else {i++;}}//此时表明不存在元素return false;}
}

解3(二分查找):
核心思想:在形式上将矩阵所有元素放在一个数组中(因为每一行的第一个元素大于上一行的最后一个元素,因此可以这么操作),在实际上通过matrix[i/n][i%n]获取mid在matrix中对应的元素,然后使用二分查找

时间复杂度: O ( l o g ( m n ) ) O(log (mn)) O(log(mn))
空间复杂度: O ( 1 ) O(1) O(1)。未使用辅助数组。

class Solution {public boolean searchMatrix(int[][] matrix, int target) {//获取行数、列数int m = matrix.length;int n = matrix[0].length;//定义二分查找的指针int low = 0;int high = m * n - 1;//只要两个指针不重合,就继续循环while (low <= high) {//获取中位数int mid = (low + high) / 2;//获取矩阵对应的mid元素int item = matrix[mid / n][mid % n];//判断是否存在if (item == target) {return true;} else if (item > target) {high = mid - 1;} else {low = mid + 1;}}//未找到return false;}
}

参考:
1、灵神题解

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

相关文章:

  • SSH公私钥连接(Git、Linux服务器)
  • 篇章五 系统性能优化——资源优化——CPU优化(2)
  • 记录jackson解析出错
  • 设计模式(二)
  • Python自动化办公工具开发实践:打造智能报表生成系统的心得与洞见
  • 3.ES索引、映射、字段和文档
  • 锂电池充电芯片XSP30,2-3节串联锂电池升降压充电管理芯片
  • FastAPI如何用角色权限让Web应用安全又灵活?
  • 探索现代 Web 开发:从 HTML5 到 Vue.js 的全栈之旅
  • Linux部署elasticsearch 单机版
  • 自然语言处理期末复习
  • 高效账号信息管理工具,可安全随机生成密码
  • VSCode如何优雅的debug python文件,包括外部命令uv run main.py等等
  • 理解与建模弹性膜-AI云计算数值分析和代码验证
  • LeetCode - 76. 最小覆盖子串
  • 三维激光雷达在智慧工厂物流测量中的应用分析
  • Python内存互斥与共享深度探索:从GIL到分布式内存的实战之旅
  • Oracle 中使用CONNECT BY、START WITH递归查询
  • 黄仁勋在2025年巴黎VivaTech大会上的GTC演讲:AI工厂驱动的工业革命(下)
  • 今日行情明日机会——20250613
  • 胶囊网络破解图像旋转不变性难题 ——从空间关系到姿态矩阵的几何深度学习革命
  • 轻量级 ioc 框架 loveqq,支持接口上传 jar 格式的 starter 启动器并支持热加载其中的 bean
  • 经济系统的「资源死锁」与「架构重构」:从通缩陷阱到可持续模型设计
  • MySQL(多表设计、多表查询)
  • Android S - 重复播放按键音(上下左右、OK)
  • Java详解LeetCode 热题 100(32):LeetCode 138. 随机链表的复制
  • Linux常用命令加强版替代品
  • 探索弹性弦行为:从绘图到问题解决-AI云计算数值分析和代码验证
  • 永不休眠:Linux 守护进程的工作原理
  • visual studio小番茄插件某些快捷键失效