[100天每天一个算法--第7天] 二维数组中的查找

版权声明:转载请加链接 https://blog.csdn.net/qq_33722172/article/details/81812651

题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路一:
每个数组的长度相同,每一行从左到右递增,每一列从上到下递增,那么我们可以从这入手,设二维数组的高度即一维数组数目为height,每一个一维数组宽度为weight,从二维数组左下角的元素array[height-1][0]开始比较,要查找的元素比它大则将0加1,比它小则将(height-1)减1,以此类推最终得到结果
代码如下:

function Find($target, $array)
{
    $arr_height = count($array);//二维数组的高度
    $arr_width = count($array[0]);//二维数组的宽度
    $oneKey = $arr_height-1;
    $twoKey = 0;
    while(($oneKey >= 0) && ($twoKey <= $arr_width))//数组边界判断
    {
        if ($target == $array[$oneKey][$twoKey]) 
        {
            return true;
        } elseif ($target > $array[$oneKey][$twoKey])
        {
            $twoKey += 1;
        } elseif ($target < $array[$oneKey][$twoKey])
        {
            $oneKey -= 1;
        }
    }
    return false;
}

思路二:
运用二分查找,二维数组的每个子元素都是一个一维数组,这里可以对每个一位数组使用二分查找
代码如下:

function Find($target,$array)
{
    $arr_height = count($array);
    for($i = 0; $i<= $arr_height-1;$i++)
    {
        $flag = binarysearch($array[$i], $target);
        if ($flag == true) 
        {
            return true;
        }

    }
    return false;
}

function binarysearch($arr,$X) {
    $left = 0;
    $right = count($arr)-1;
    while($left<=$right) {
        $mid = floor(($left+$right)/2);
        if ($X < $arr[$mid]) {
            $right = $mid-1;
        } elseif ($X > $arr[$mid]) {
            $left = $mid+1;
        } elseif ($X = $arr[$mid]) {
            return true;
        }
    }
    return false;//代表找不到
}

当然方法肯定不止这两种,这里只是提供两个解决问题的思路,有更好的解决思路可以分享在评论区里

猜你喜欢

转载自blog.csdn.net/qq_33722172/article/details/81812651
今日推荐