题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路一:
每个数组的长度相同,每一行从左到右递增,每一列从上到下递增,那么我们可以从这入手,设二维数组的高度即一维数组数目为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;//代表找不到
}
当然方法肯定不止这两种,这里只是提供两个解决问题的思路,有更好的解决思路可以分享在评论区里