1、题目描述
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
数据范围:矩阵的长宽满足 0 \le n,m \le 5000≤n,m≤500 , 矩阵中的值满足 0 \le val \le 10^90≤val≤109
进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n+m)O(n+m)
2、算法分析
二维数组array[][]知识补充:
①二维数组行的表示:array.length
②二维数组列的表示:array[0].length
本题判断二维数组中是否含有target这个数,有的话返回true;没有的话返回false;
遍历二维数组的每一行,然后每一行使用二分查找。
3、代码实现
/*
判断二维数组种是否存在target元素
可以把二维数组看成一维数组。
arr.length是二维数组的行。arr[0].length可以看成二维数组的列。
*/
public class Solution {
public boolean Find(int target, int [][] array) {
if(array == null || array.length == 0){
return false;
}
for(int i = 0;i < array.length;i++){
int low = 0;
int high = array[0].length - 1;
while(low <= high){
int mid = low + (high - low) / 2;
if(array[i][mid] == target){
return true;
}else if(array[i][mid] > target){
high = mid - 1;
}else{
low = mid + 1;
}
}
}
return false;
}
}