题目:
思路:
一看见有序查找,自然而然想到二分搜索,但题目给的条件还可以进一步优化。
1.因为每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,所以左上角和右下角分别是二维数组的最小值和最大值,这样可以在寻找前先简单比较,如果小于最小值或大于最大值直接返回false
2.同样因为有序,所以每一行的二分搜索并不需要从头到尾,而是可以根据上一行的搜索结果来判断。
如:我的二分搜索找的是第一个大于等于目标值的数的下标,如果找到了这样一个数,那么下一行的二分结尾直接可以=当前找到下标-1,因为题目的有序性;如果找不到,那么下一行结尾位置不变
代码:
public class Solution {
public boolean Find(int target, int [][] array) {
if (array == null || array[0].length == 0){
return false;
}
//比最大的大,比最小的小都不用找了
if (target > array[array.length-1][array[0].length-1] || target < array[0][0]){
return false;
}
int left = 0;
int right = array[0].length-1;
for (int i = 0; i < array.length; i++) {
if (right < 0){
return false;
}
int result = binarySearch(array, i, left, right, target);
if (result == -1){
continue;
}else if (array[i][result] == target){
return true;
}else {
right = result - 1;
}
}
return false;
}
public int binarySearch(int[][] array, int row, int left, int right, int target){
int result = -1;
while (left <= right){
int mid = (left + right) / 2;
if (array[row][mid] >= target){
right = mid - 1;
result = mid;
}else {
left = mid + 1;
}
}
return result;
}
}