zoukankan      html  css  js  c++  java
  • 【剑指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 }

    通过这个题目,我们可以想到,当我们在查找一个数的时候,可以逐渐减少查询的区间。来加快查询。

  • 相关阅读:
    总结的git操作命令小抄集
    两种方式实现压缩文件或文件夹
    eclipse 中执行 main 函数如何添加参数
    alert()、confirm()和prompt()的区别与用法
    阿里某安全工程师写的明星代码
    在 Linux 环境下报错 java.lang.reflect.InvocationTargetException
    MyBatis学习-SQL 符号篇
    初识IP基础分类、CIDR
    Snort
    Dshell----开源攻击分析框架
  • 原文地址:https://www.cnblogs.com/tl542475736/p/8669189.html
Copyright © 2011-2022 走看看