【剑指Offer学习】【面试题:二维数组中的查找】PHP实现
最近一直看剑指Offer、里面很多算法题。于是就想着用PHP来显示一下。
题目:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
拿到这个题目。我们第一个反应,就是遍历二维数组。然后逐个进行比较。我们不难用PHP进行实现。于是有了下面的代码
function TwoArrayFind($array,$search) {
$found = false;
if(empty($array) || !is_array($array) || empty($search)) {
return $found;
}
$rows = count($array); //行数
$cols = count($array[0]); //列数
for ($i=0; $i < $rows ; $i++) {
for ($j=0; $j < $cols ; $j++) {
if($array[$i][$j] == $search) {
$found = true;
break 2;//跳出两层循环
}
}
}
return $found;
}
但是这个算法的实现的复杂度是O(n^2),于是我们可以通过其他的方法。来简化。
二维数组的构造就是类似下图。

我们选择一个参考点,来逐次减少查询的行数和列数。
观察发现。每行都是从左到右递增,从上往下递增。

假设我们要查找13.我们选择右上角的5作为参考点。要查询的数字大于5.可以把当前行,全部排除
我们如果查询是3.选择5作为参考点,3小于5,可以排除5所在的列。一次就踢掉了很多的元素。

通过每次这样的判断。我们减少了很多数字的比较。PHP代码实现如下
function TwoArrayFind($array,$search)
{
$found = false; if(empty($array) || !is_array($array) || empty($search)) {
return $found;
} $rows = count($array);//行数
$cols = count($array[0]);//列数 $row = 0;//行标识
$col = $cols-1; //列标识 末端列 while($row < $rows && $col >= 0 ) { if($array[$row][$col] == $search) {
$found = true;
break;
}
//右上角元素大于要查询的 减少列
if($array[$row][$col] > $search) {
--$col;
}else if($array[$row][$col] < $search){
++$row;
}
} return $found; }
通过这个题目,我们可以想到,当我们在查找一个数的时候,可以逐渐减少查询的区间。来加快查询。
【剑指Offer学习】【面试题:二维数组中的查找】PHP实现的更多相关文章
- 《剑指Offer》面试题-二维数组中的查找
题目1384:二维数组中的查找 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7318 解决:1418 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到 ...
- 剑指offer学习读书笔记--二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都是按照从上到下递增的顺序排序.请设计一个函数,输入这样的一个二维数组和一个整数,判断数组是否含有这个整数. 1 2 8 9 2 4 9 1 ...
- 剑指Offer - 九度1384 - 二维数组中的查找
剑指Offer - 九度1384 - 二维数组中的查找2013-11-23 23:23 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...
- 剑指offer【01】- 二维数组中的查找(Java)
在经历了春招各大公司的笔试题和面试官的血虐之后,决定要刷一些算法题了,不然连面试机会都没有. 而应对笔试和面试,比较出名的就是剑指offer的题目和LeetCode的题目了.剑指offer应对面试中的 ...
- 剑指offer第二版-4.二维数组中的查找
面试题4:二维数组中的查找 题目要求: 一个二维数组中,每一行从左到右递增,每一列从上到下递增.输入一个整数,判断数组中是否含有该整数 /** * @since 2019年2月13日 下午5:08:5 ...
- 剑指offer笔记面试题4----二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 测试用例: 二维数组中包含 ...
- 剑指Offer编程题1——二维数组中的查找
剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...
- 【剑指Offer】1、二维数组中的查找
题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否 ...
- 剑指offer(3)——二维数组中的查找
题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 思路: 首先选取数组中右上 ...
- 【剑指Offer】01、二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
随机推荐
- Column 'id' in where clause is ambiguous
1.错误描述 org.hibernate.exception.ConstraintViolationException: error executing work at org.hibernate.e ...
- SCRIPT5007:无法获取属性“show”的值,对象为null或未定义
1.错误描述 SCRIPT5007:无法获取属性"show"的值,对象为null或未定义 dojo.js,行15.字符11808 2.错误原因 requ ...
- Java和Flex整合报错(四)
1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...
- Dynamics 365 Online-60000 API Limits
最近,Dynamics 365官方文档有最新的发布,就是从2018.3.19开始,会对API请求的数目有个限制:在连续的5分钟里,一个连接用户,针对一个CRM Organization,API请求数不 ...
- Java面试题积累
持续积累中... 1.Java支持的数据类型有哪些?什么是自动拆装箱? 数据类型分为两大种,基本类型和引用类型. 基本类型有8种:byte short int long char float doub ...
- js实现内容点击复制
<!DOCTYPE html><html> <head> <script type="text/javascript"> funct ...
- Java关键字——native
本篇博客我们将介绍Java中的一个关键字——native. native 关键字在 JDK 源码中很多类中都有,在 Object.java类中,其 getClass() 方法.hashCode()方法 ...
- jquery实例权威指南
jquery的$(function(){}) 效率高于window.onload,前者页面框架加载完就执行,后者全部加载完毕且图片下载完毕后方可执行.且前者可以写多个,每次执行结果不同,后者的话尽管可 ...
- 论文笔记(8):BING: Binarized Normed Gradients for Objectness Estimation at 300fps
译文: <基于二值化赋范梯度特征的一般对象估计> 摘要: 通过训练通用的对象估计方法来产生一组候选对象窗口,能够加速传统的滑动窗口对象检测方法.我们观察到一般对象都会有定义完好的封闭轮廓, ...
- 【xsy2140】计数
Time Limit: 1000 ms Memory Limit: 256 MB description 吐槽 所以说..组合数的题是不是都是知道大致思路但是就是不会写qwq菜醒qwq 正题 这题其实 ...