asp 判断数组等于_二维数组中的查找

a88276b2031a1c33930e1205d0c50b29.png

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

示例:

现有矩阵 matrix 如下:

[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]

代码如下

方法一

思路:循环比较单个数组的最大值和最小值 判断是否在此范围内

class Solution {

    /**
     * @param Integer[][] $matrix
     * @param Integer $target
     * @return Boolean
     */
    function findNumberIn2DArray($matrix, $target) {
        $min=$matrix[0][0];//获取数组最小值
        if($target<$min){
            return false;
        }
        $arr_count=count($matrix)-1;
        $max=$matrix[$arr_count][count($matrix[$arr_count])-1];//获取数组最大值
        //print_R($max);die;
        if($target>$max){
            return false;
        }
        //第一种方法 没有用上数组是有序的这一关键点 4ms
       for($i=0;$i<$arr_count+1;$i++){
            foreach($matrix[$i] as $v){
                if($v==$target){
                    return true;
                }
            }
            
        }
       /*同一种方法的不同实现
        foreach($matrix as $k=>$v){ //8ms
            foreach($v as $v1){
                if($v1==$target){
                    return true;
                }
            }            
        } */
        return false;//执行到这就说明没有找到  否则找到就返回了
       
       

    }
}

总结:使用的暴力方法 没有用到题目中说好的排序

第二种方法

思路

1.数组是n*m且有序的 是一个矩阵 则每一行的数组元素个数是相同的

2.获取每一行的最大值和需要确定的数字做比较 8ms

        $row_numbers=count($matrix[0]);//获取一行数组有多少个元素
        foreach($matrix as $k=>$v){
            $row_max=$v[$row_numbers-1];
            //print_R($row_max.'---');
            if($target<=$row_max){ //只有小于等于这行的的最大值才进行判断 
               foreach($v as $v1){
                   if($v1==$target){
                       return true;
                   }
               }     
            }
        }
        return false;

总结:其实这个题目主要考察的是二分查找算法 但是本人目前没有吃透二分查找算法,吃透后再补充。

写给自己的话:坚持总是没有错的 加油!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值