在一个 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;
总结:其实这个题目主要考察的是二分查找算法 但是本人目前没有吃透二分查找算法,吃透后再补充。
写给自己的话:坚持总是没有错的 加油!!!