一眼二分查找
有一个比较简单的做法(虽然时间复杂度不如二分),按照比该整数小和比该整数大,可以把整个二维数组分成左右两部分(可能某一部分为空),所以我们只需要沿着这条 “裂缝” 寻找有没有和该整数一样大小的数就可以了。
二分做法,取左上角和右下角作为起始边界条件,中值是矩阵的中心,如果目标比中值大,我们需要在 除了左上角的那块矩形之外空间寻找目标值,反之亦然。
做法不难,反而在结束寻找的条件上踩了坑,其实只要和一维数组的二分一样就可以了,当小边界比大边界大时结束寻找
(写完看了题解才发现,官方给的就是我说的第一种做法,称为线性查找)
自己的(0ms)
class Solution {
boolean find(int[][] matrix, int target,int l1,int l2,int r1,int r2){
if((l1 == r1 && l2 == r2 && matrix[l1][l2] != target) || l1 > r1 || l2 > r2)
return false;
int mid1 = (l1 + r1) >> 1,mid2 = (l2 + r2) >> 1;
if(matrix[mid1][mid2] == target)
return true;
if(matrix[mid1][mid2] > target)
return find(matrix,target,l1,l2,mid1 - 1,r2) || find(matrix,target,l1,l2,r1,mid2 - 1);
else
return find(matrix,target,mid1 + 1,l2,r1,r2) || find(matrix,target,l1,mid2 + 1,r1,r2);
}
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix.length == 0)
return false;
return find(matrix,target,0,0,matrix.length - 1,matrix[0].length - 1);
}
}