74. 搜索二维矩阵
难度:中等
标签:二分查找法
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true
示例 2:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
输出: false
思路:
1.当然可以双重for循环遍历这个二维数组,O(mn)的复杂度
2.观察他的特点,是从小到大的顺序排的
3.可以先确定这个数在哪一行,然后在这一行上面二分查找法,行为m,列为n
时间复杂度是O(m+log2 n)
public boolean searchMatrix(int[][] matrix, int target){
//求出行
int hang=matrix.length;
//行数等于0
if(hang==0) return false;
//求出列
int lie=matrix[0].length-1;
//列数为0
if(lie==-1) return false;
int pos=0;
for(int i=0;i<hang;i++){
//确定大致位置,在哪一行
if(target>=matrix[i][0]&&target<=matrix[i][lie]){
pos=i;
break;
}
}
//如果都不在return false
if(pos==hang) return false;
int left=0,right=lie;
int flag=0;
int[] a=matrix[pos];
//正常的二分查找
while(left<=right){
int mid=(left+right)/2;
if(target<a[mid]){
right=mid-1;
}
else if(target>a[mid]){
left=mid+1;
}
else {
flag=1;
break;
}
}
if(flag==1) return true;
else return false;
}