【剑指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、二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
随机推荐
- R语言实现SOM(自组织映射)模型(三个函数包+代码)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- SOM自组织映射神经网络模型 的R语言实现 笔 ...
- Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field
1 错误描述 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.s ...
- Struts2(三) 配置struts.xml的提示(在不联网的情况下)
开发过程中如果可以上网,struts.xml 会自动缓存dtd,提供提示功能.如果不能联网需要我们配置本地dtd,这样才能让struts2 产生提示 1.首先,在EClipse中依次点击工具栏中的wi ...
- Qt5.6.0+OpenGL 纹理贴图首战告捷
重要的话写在前面~~通过今晚的实验,知道了EBO是不能随便release的~~~一直不要release就可以了,否则vao会失效 Display.h #ifndef DISPLAYWIDGET_H # ...
- iOS - Mac 常用快捷键
前言 可以按下组合键来实现通常需要鼠标.触控板或其他输入设备才能完成的操作. 要使用键盘快捷键,需按住一个或多个修饰键,同时按快捷键的最后一个键.例如,要使用快捷键 Command-C(拷贝),请按住 ...
- 权限的分类(shiro项目中来的五)
第一种权限:菜单栏展示还是不展示的权限(粗颗粒) 实现方法,在SYS_ROLE表中添加一个字段rights,通过 public static BigInteger sumRights(String[] ...
- ASP.NET 后台打开新页面
[TOC] Response.Write 这是最常见的后台打开新页面的方法. Response.Write("<script>window.open('~/FileView.as ...
- n人围成一圈报数
题目:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位 思路:用一个数组存这n个人,里面的初始状态全设为1,表示都还在圈子里面. ...
- lvs-nat 模式-piranha
系统: redhat 6.5 mini 机器名 ip vip gw lvs01(主lvs) 192.168.10.10(外网) 192.168.20.10(内网) 192.168.10.254 lvs ...
- JAVA通过COM接口操作PPT
一. 背景说明 在Eclipse环境下,开发JAVA代码操作PPT,支持对PPT模板的修改.包括修改文本标签.图表.表格.满足大多数软件生成PPT报告的要求,即先收工创建好模板,在程序中修改模板数据. ...