news 2026/9/12 5:06:00

一天一道算法题(32):搜索二维数组

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一天一道算法题(32):搜索二维数组

74. 搜索二维矩阵


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

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

你必须编写一个时间复杂度为O(log(m * n))的解决方案。

示例 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

四种解题思路

接下来我会带着你,从 O(m·n) 一步步优化到 O(log(m·n))。

第一种:暴力枚举(O(m·n))

嵌套 for 循环逐个判断,都没匹配就返回 false。这种做法一定会超时,也不符合题目要求,这里不展开。

第二种:逐行二分(O(m·log n))

对每一行各做一次二分查找。这是最常见的优化思路,但它适用于“行与行之间整体不保证严格递增”的情况——比如下一行第一个元素不一定大于上一行最后一个元素。而这道题的二维数组整体是严格升序的,所以这个做法还不够,需要继续优化。

第三种:两次二分(O(log m + log n) = O(log(m·n)))

从这里开始,才是这道题能 AC 的解法。

思路是:第一次二分确定 target 如果存在,应该在哪一行;第二次二分在这一行里继续找。两次二分就能定位到 target

  • Java 代码演示
classSolution{publicbooleansearchMatrix(int[][]matrix,inttarget){introwIndex=binarySearchFirstColumn(matrix,target);if(rowIndex<0){returnfalse;}returnbinarySearchRow(matrix[rowIndex],target);}publicintbinarySearchFirstColumn(int[][]matrix,inttarget){intlow=-1,high=matrix.length-1;while(low<high){intmid=(high-low+1)/2+low;if(matrix[mid][0]<=target){low=mid;}else{high=mid-1;}}returnlow;}publicbooleanbinarySearchRow(int[]row,inttarget){intlow=0,high=row.length-1;while(low<=high){intmid=(high-low)/2+low;if(row[mid]==target){returntrue;}elseif(row[mid]>target){high=mid-1;}else{low=mid+1;}}returnfalse;}}作者:力扣官方题解 链接:https://leetcode.cn/problems/search-a-2d-matrix/solutions/688117/sou-suo-er-wei-ju-zhen-by-leetcode-solut-vxui/来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • Golang 代码演示
funcsearchMatrix(matrix[][]int,targetint)bool{iflen(matrix)==0||len(matrix[0])==0{returnfalse}m,n:=len(matrix),len(matrix[0])// 第一次二分:定位行// 找第一个满足 matrix[row][n-1] >= target 的行top,bottom:=0,m-1fortop<bottom{mid:=top+(bottom-top)/2ifmatrix[mid][n-1]<target{top=mid+1}else{bottom=mid}}row:=top// 第二次二分:在该行内查找left,right:=0,n-1forleft<=right{mid:=left+(right-left)/2ifmatrix[row][mid]==target{returntrue}elseifmatrix[row][mid]<target{left=mid+1}else{right=mid-1}}returnfalse}

第四种:模拟一维数组

如果把二维数组按元素个数“摊平”,对上面那个 3×4 的数组来说,几乎所有人都会把第一行第一个元素当作第 1 个元素,把第三行第四个元素当作第 12 个元素。我们就按这个逻辑模拟一维数组——整个数组长度为 12。

那问题来了:怎么把这个“脑海中模拟的一维数组”和真实的二维数组做映射?

这里直接给公式:

matrix[mid / n][mid % n]
稍微推演一下就能明白:mid / n 定位行,mid % n 定位列。

好,现在按这个思路写代码。

Java 代码演示

classSolution{publicbooleansearchMatrix(int[][]matrix,inttarget){intm=matrix.length,n=matrix[0].length;intlow=0,high=m*n-1;while(low<=high){intmid=(high-low)/2+low;intx=matrix[mid/n][mid%n];if(x<target){low=mid+1;}elseif(x>target){high=mid-1;}else{returntrue;}}returnfalse;}}作者:力扣官方题解 链接:https://leetcode.cn/problems/search-a-2d-matrix/solutions/688117/sou-suo-er-wei-ju-zhen-by-leetcode-solut-vxui/来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Golang 代码演示

funcsearchMatrix(matrix[][]int,targetint)bool{m,n:=len(matrix),len(matrix[0])l,r:=0,m*n-1forl<=r{mid:=l+(r-l)/2ifmatrix[mid/n][mid%n]==target{returntrue}elseifmatrix[mid/n][mid%n]<target{l=mid+1}else{r=mid-1}}returnfalse}

总结

本文是 《算法题目解析系列》 的第 [32] 篇,本系列将持续更新,每篇都提供清晰的思路与编程语言实现。欢迎关注,第一时间获取更新。如果你有想看的题目,也可以在评论区留言告诉我。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 5:04:35

Python逆向文本处理工具revtools详解与应用

1. revtools包概述与核心价值revtools是Python生态中一个专注于文本逆向处理的实用工具包&#xff0c;主要解决文本分析、数据清洗和模式提取中的逆向操作需求。我在处理古籍数字化项目时首次接触到这个包&#xff0c;当时需要从大量非结构化的历史文献中提取特定格式的引文&am…

作者头像 李华
网站建设 2026/9/12 5:02:34

Codex CLI工具:自然语言转代码的终端开发利器

1. Codex CLI工具核心功能解析Codex CLI作为开发者与大模型交互的终端工具&#xff0c;其核心价值在于将自然语言指令转化为可执行代码。与GUI工具不同&#xff0c;CLI版本特别适合以下场景&#xff1a;需要批量处理代码生成任务时&#xff08;如自动生成多个函数的单元测试&am…

作者头像 李华
网站建设 2026/9/12 5:02:32

Aspen Plus在合成气低温蒸馏净化中的模拟优化

1. 项目概述&#xff1a;合成气净化与Aspen Plus模拟低温蒸馏法去除合成气中的H₂S和CO₂是化工领域常见的分离工艺。合成气作为煤化工、天然气重整等过程的主要产物&#xff0c;其净化处理直接关系到后续工艺的安全性和经济性。传统湿法脱硫脱碳工艺存在溶剂损耗大、能耗高等问…

作者头像 李华
网站建设 2026/9/12 5:01:05

OpenLayers瓦片图层原理与实战应用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华