分析:这个题目比较简单,容易的想到的方法是逐行用二分查找。但仔细一想能发现,这样做会有很多重复比较的数据,因此算法可以优化。具体优化解析见书本P38
常规方法:
public boolean isElement(
int[][] arr,
int data) {
int low =
0, high =
0 , mid =
0;
for(
int i=
0; i<arr.length; i++ ){
low =
0;
high = arr[i].length -
1;
while(low <= high) {
mid = low + (high - low) /
2;
if(arr[i][mid] == data) {
return true;
}
else if(arr[i][mid] > data) {
high = mid -
1;
}
else {
low =mid +
1;
}
}
}
return false;
}
优化方法:
public boolean isElement(
int[][] arr,
int data) {
int i =
0 , j = arr[
0].length -
1;
while (i<=arr.length-
1 && j>=
0) {
while (j >=
0 && arr[i][j] > data) j--;
if (j <
0)
return false;
while (i <= arr.length -
1 && arr[i][j] < data) i++;
if (i > arr.length -
1)
return false;
if (arr[i][j] == data)
return true;
}
return false ;
}