【剑指Offer学习】【面试题:二维数组中的查找】PHP实现
最近一直看剑指Offer、里面很多算法题。于是就想着用PHP来显示一下。
题目:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
拿到这个题目。我们第一个反应,就是遍历二维数组。然后逐个进行比较。我们不难用PHP进行实现。于是有了下面的代码
1 function TwoArrayFind($array,$search) { 2 $found = false; 3 4 if(empty($array) || !is_array($array) || empty($search)) { 5 return $found; 6 } 7 8 $rows = count($array); //行数 9 $cols = count($array[0]); //列数 10 11 for ($i=0; $i < $rows ; $i++) { 12 for ($j=0; $j < $cols ; $j++) { 13 if($array[$i][$j] == $search) { 14 $found = true; 15 break 2;//跳出两层循环 16 } 17 } 18 } 19 return $found; 20 }
但是这个算法的实现的复杂度是O(n^2),于是我们可以通过其他的方法。来简化。
二维数组的构造就是类似下图。
我们选择一个参考点,来逐次减少查询的行数和列数。
观察发现。每行都是从左到右递增,从上往下递增。
假设我们要查找13.我们选择右上角的5作为参考点。要查询的数字大于5.可以把当前行,全部排除
我们如果查询是3.选择5作为参考点,3小于5,可以排除5所在的列。一次就踢掉了很多的元素。
通过每次这样的判断。我们减少了很多数字的比较。PHP代码实现如下
1 function TwoArrayFind($array,$search) 2 { 3 $found = false; 4 5 if(empty($array) || !is_array($array) || empty($search)) { 6 return $found; 7 } 8 9 $rows = count($array);//行数 10 $cols = count($array[0]);//列数 11 12 $row = 0;//行标识 13 $col = $cols-1; //列标识 末端列 14 15 while($row < $rows && $col >= 0 ) { 16 17 if($array[$row][$col] == $search) { 18 $found = true; 19 break; 20 } 21 //右上角元素大于要查询的 减少列 22 if($array[$row][$col] > $search) { 23 --$col; 24 }else if($array[$row][$col] < $search){ 25 ++$row; 26 } 27 } 28 29 return $found; 30 31 }
通过这个题目,我们可以想到,当我们在查找一个数的时候,可以逐渐减少查询的区间。来加快查询。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2017-03-29 cmder默认的命令提示符λ改成$