news 2026/5/28 22:34:01

064搜索二维矩阵

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
064搜索二维矩阵

搜索二维矩阵

题目链接:https://leetcode.cn/problems/search-a-2d-matrix/description/?envType=study-plan-v2&envId=top-100-liked

我的解答:

public boolean searchMatrix(int[][] matrix, int target) { int m = matrix.length, n = matrix[0].length; int l = 0, r = m - 1; int row = 0; //找到target可能所在的行 while(l <= r){ int mid = l + ((r - l) >>1); if(matrix[mid][0] <= target){ l = mid + 1; row = mid; } else{ r = mid - 1; } } l = 0; r = n-1; int col = 0; //在row行上查找target while(l <= r){ int mid = l + ((r - l) >>1); if(matrix[row][mid] <= target){ l = mid + 1; col = mid; } else{ r = mid - 1; } } return matrix[row][col] == target; }

分析:代码的时间复杂度为O(logm + logn) = O(logmn),空间复杂度为O(1)。解题思路:两次二分查找,先对二维矩阵的第一列进行一次二分查找,找到最后一个第一个数字小于等于target的行,然后在这行上再进行一次二分查找,寻找是否存在target。

看了官方题解后的解答:

//方法一:两次二分查找 //时间复杂度:O(logm+logn)=O(logmn) //空间复杂度:O(1) public boolean searchMatrix(int[][] matrix, int target) { int rowIndex = binarySearchFirstColumn(matrix, target); if(rowIndex < 0){ return false; } return binarySearchRow(matrix[rowIndex], target); } public int binarySearchFirstColumn(int[][] matrix, int target){ int l = -1, r = matrix.length - 1; while(l < r){ int mid = l + ((r - l + 1) >> 1);//为什么r-l还要加一?防止l = -1 且r = 0时的越界情况 if(matrix[mid][0] <= target){ l = mid; } else{ r = mid - 1; } } return l; } public boolean binarySearchRow(int[] row, int target){ int l = 0, r = row.length - 1; while(l <= r){ int mid = l + ((r - l) >> 1); if(row[mid] == target){ return true; } else if(row[mid] < target){ l = mid + 1; } else{ r = mid - 1; } } return false; } //方法二:一次二分查找 //时间复杂度:O(logmn) //空间复杂度:O(1) public boolean searchMatrix(int[][] matrix, int target) { int m = matrix.length, n = matrix[0].length; int l = 0, r = m * n - 1; while(l <= r){ int mid = l + ((r - l) >> 1); int x = matrix[mid / n][mid % n]; if(x == target){ return true; } else if(x < target){ l = mid + 1; } else{ r = mid - 1; } } return false; }

分析:

​ 1、方法一的解题思路与我的解答思路一致,只是实现上所有区别,具体区别请看代码。对于此方法,尤其要注意边界情况。

​ 2、方法二的解题思路:根据题目,我们可以想象将每一行都拼接在上一行的末尾,这样我们就得到了一个一维的升序数组,我们可以在该数组上二分查找目标元素。代码实现时,可以二分升序数组的下标,将其映射到原矩阵的行和列上。

总结

  • 本题主要有两种方法解题,分别为两次二分查找、一次二分查找。主要还是需要掌握二分查找,并仔细分析边界情况。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 22:34:00

小学期——第二周

一.LM555CN定时器输出方波1.学习笔记2.仿真电路图所需元器件&#xff1a;LM555CN&#xff0c;5.1k、2.2k可调电阻&#xff0c;2.2uF、10nF电容3.仿真结果经过公式计算频率 f 1.039kHz占空比 58%

作者头像 李华
网站建设 2026/5/28 22:33:07

小白也能看懂!AI大模型概念清单,收藏这份学习指南轻松入门

本文以通俗易懂的方式科普了AI大模型的基础概念&#xff0c;包括大模型如何工作、Token与上下文窗口的含义、多模态AI的能力、训练与推理的区别等。通过类比和实例&#xff0c;帮助初学者理解AI技术的核心原理&#xff0c;为后续学习应用层面的概念&#xff08;如Prompt、RAG等…

作者头像 李华
网站建设 2026/5/28 22:31:32

16 - 常用内置函数与标准库

16 - 常用内置函数与标准库Python 自带了很多好用的函数和模块&#xff0c;这章挑最实用的讲。不用全记住&#xff0c;知道有这些东西&#xff0c;需要的时候回来查就行。常用内置函数 数学相关 # abs() — 绝对值 print(abs(-5)) # 5# round() — 四舍五入 print(round(3.…

作者头像 李华
网站建设 2026/5/28 22:30:28

告别论文焦虑!okbiye 双 buff 加持,检测 + 降重一键拿捏

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT降重复率 - Okbiye智能写作https://www.okbiye.com/reduceAIGC 一、前言&#xff1a;当代论文 er 的双重 “死亡” 困境 当查重率红线、AIGC 检测线双双亮起红灯&#xff0c;相信不少同学都有过这种窒…

作者头像 李华