题目
题解
二分查找
父老乡亲们,接下来我们来到了二维空间的二分查找!
其实就是起了个高大上的名字,本质还是一维数组的二分查找。对二维数组的每一行进行二分查找,最终得到目标值。
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m=matrix.length,n=matrix[0].length;
//逐行二分查找
for(int[] row:matrix){
if(search(row,target))
return true;
}
return false;
}
//二分查找
public boolean search(int[] num,int target){
int low=0,high=num.length-1;
while(low<=high){
int mid=(low+high)/2;
if(num[mid]==target)
return true;
else if(num[mid]<target)
low=mid+1;
else
high=mid-1;
}
return false;
}
}
时间复杂度: O ( m l o g n ) O(mlogn) O(mlogn)
空间复杂度: O ( 1 ) O(1) O(1)
Z 字形查找
从矩阵的右上角开始,
若matrix[x][y]>目标值,左移一位,即y–;
若matrix[x][y]<目标值,下移一位,即x++;
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m=matrix.length,n=matrix[0].length;
int x=0,y=n-1;
while(x<m && y>=0){
int num=matrix[x][y];
if(num==target)
return true;
else if(num<target)
x++;//下移
else
y--;//左移
}
return false;
}
}
时间复杂度: O ( m + n ) O(m+n) O(m+n)
空间复杂度: O ( 1 ) O(1) O(1)