分析:这个题目比较简单,容易的想到的方法是逐行用二分查找。但仔细一想能发现,这样做会有很多重复比较的数据,因此算法可以优化。具体优化解析见书本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 ;
}