剑指offer第二版面试题4:二维数组中的查找(java)
面试题4:二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数。
当然最简单的两层循环是可以实现的,但是这样没有意义,我的第一个反应就是双层循环的稍微优化一点点。
-
main函数
public static void main(String[] args) { int[][] arr = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}}; System.out.println(findnumber(arr,14));; }
-
手写
public static boolean findnumber(int[][] arr,int number){
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if(arr[i][j]==number){
return true;
}else {
if (arr[i][j]>number){
break;
}
}
}
}
return false;
}
就是从左上方开始,如果发现下一个元素比number大,那么直接进入下一行去比较。
缺点:O2的时间复杂度
-
答案
从右上角或者左下角开始进行查找,只要比最右侧列的第一个元素小,则最右侧一整列的元素都可舍弃,进行下一次循环,如果比最右侧列的第一个元素大,则舍弃掉这一行,以此类推,直到找到该元素。
public static boolean findnumber(int[][] arr,int number){
int rows = 0; //行数
int coloumns = arr[0].length-1; //列数
while (rows<arr.length && coloumns>=0){
if(arr[rows][coloumns]==number){
return true;
}else if(arr[rows][coloumns]>number){
coloumns--;
}else if(arr[rows][coloumns]<number){
rows++;
}
}
return false;
}
分析:本题的关键就在于,发现右上角这一个特殊的点,左上是比自己小的,右下是比自己大的。那么只要找到角即可解决问题。
分类:
剑指Offer
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义