在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整function Find($target, $array)
function Find($target, $array) { for($i = 0;$i<count($array);$i++){ for($j = 0;$j<count($array[$i]);$j++){ echo $target."==".$array[$i][$j]; if($target !== $array[$i][$j]){ continue; }else{ return '存在'; } } } }
上面算法是性能最差的。。。
下面思路:
可把这个数组想象成一个矩阵结构如下
可以看出矩阵四个角都可利用。比如先取出右上角与目标比较,因为数组是有序的,则右上角大于target则舍弃最后一列往左移动。如果右上角小于target,则舍弃一行,行往下移动。
具体代码如下:
//右上角比较 //行往下走,列往左走 function rightFind($target, $array){ $row = count($array);//行 $col = count($array[0]) - 1;//列 假设数组长度都相同 $i = 0; //从第一行右上角开始比较 while($i<$row && $col>=0){ //$array[$i][$col]为右上角数字,相等则返回true if($array[$i][$col] == $target){ return true; //如果$array[$i][$col]大于目标则列数往前移动 //$col-- }else if($array[$i][$col] > $target){ $col--; //如果$array[$i][$col]小于目标则行数数往下移动 }else{ $i++; } } return false; }
/左下角比较 //行往上走减减 列往右走 加加 function leftFind($target,$array){ $row = count($array);//行 $col = count($array[0]) - 1;//列 假设数组长度都相同 $i = $row-1; //从最后一行开始往上减减 $j = 0; //列往右加加 while($i>0 && $j<=$col){ if($array[$i][$j] == $target){ return true; }elseif($array[$i][$j] > $target){ //大于行往上走 $i--; }else{ //列往右走 $j++; } } return false; }