博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【剑指offer】二维数组中的查找☆
阅读量:4879 次
发布时间:2019-06-11

本文共 3395 字,大约阅读时间需要 11 分钟。

题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
 
 
自己的思路实在是傻×了,先看下正确思路吧
 
把当前数字定位在第一行,最后一列。如果数字小则增大行,如果数字大则减小列!O(M+N)
bool Find3(vector
> array,int target) { if(array.empty() && array[0].empty()) return false; int r = 0, c = array[0].size() - 1; while(r < array.size() && c >= 0) { if(array[r][c] == target) return true; else if(array[r][c] > target) c--; else r++; } return false; }

 

 

我自己二分查找的思路,每次扔掉一半O(log(MN)),超级繁琐,也AC了

 

bool Find(vector
> array,int target) { if(array.empty() && array[0].empty()) return false; //用四个变量标记剩余的查找范围 int cleft = 0, cright = array[0].size() - 1; int rup = 0, rdown = array.size() - 1; int l, r, u, d; while(cleft <= cright && rup <= rdown) { //对限定区域的第一行进行二分查找,定位刚好小于target值的列 l = cleft, r = cright; if(array[rup][l] > target) //所有的都大于target return false; else { while(l <= r) { int m = l + (r - l) / 2; if(array[rup][m] == target) return true; else if(array[rup][m] < target) l = m + 1; else r = m - 1; } cright = r; } //对限定区域的第一列进行二分查找,定位刚好小于target值的行 u = rup, d = rdown; if(array[u][cleft] > target) //所有的都大于target return false; else { while(u <= d) { int m = u + (d - u) / 2; if(array[m][cleft] == target) return true; else if(array[m][cleft] < target) u = m + 1; else d = m - 1; } rdown = d; } //对限定区域的最后一行进行二分查找,定位刚好大于target值的列 l = cleft, r = cright; if(array[rdown][r] < target) //所有的都小于target return false; else { while(l <= r) { int m = l + (r - l) / 2; if(array[rdown][m] == target) return true; else if(array[rdown][m] < target) l = m + 1; else r = m - 1; } cleft = l; } //对限定区域的最后一列查找,定位刚好大于target值的行 u = rup, d = rdown; if(array[d][cright] < target) //所有的都小于target return false; else { while(u <= d) { int m = u + (d - u) / 2; if(array[m][cright] == target) return true; else if(array[m][cright] < target) u = m + 1; else d = m - 1; } rup = u; } } return false; //没找到 }

 

 

转载于:https://www.cnblogs.com/dplearning/p/4673937.html

你可能感兴趣的文章
Objective-C中的类目,延展,协议
查看>>
Python标准模块--Iterators和Generators
查看>>
Introduction Sockets to Programming in C using TCP/IP
查看>>
PHP 简单实现webSocket
查看>>
zookeeper部署搭建
查看>>
navigationController pop回之前控制器
查看>>
汇编语言实验一
查看>>
Web.config配置文件详解(新手必看)
查看>>
selenide总结
查看>>
selenium--控制浏览器和简单元素操作
查看>>
android spannableString 替换 textview 中部分文字
查看>>
java 引用
查看>>
关于Spring注解@Async引发其他注解失效
查看>>
关于学习的一些感悟
查看>>
算法提高 概率计算
查看>>
UVa 12716 - GCD XOR(筛法 + 找规律)
查看>>
Spring Cloud学习资料
查看>>
制作无广告启动盘
查看>>
python使用httplib2访问REST服务的例子
查看>>
经典代码(01)
查看>>