编写一个高效的算法来判断 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
题解:数组有序,并且是查找数组中是否有目标值,我们的二分查找闪亮登场了,不过这里需要注意二维数组坐标变化的一些问题,小心数组不要越界。
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m=matrix.length;
if(m==0)
return false;
int n=matrix[0].length;
if((m*n-1)/2<=1){
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(matrix[i][j]==target)
return true;
return false;
}
int l=0,r=m*n;
while(l<=r){
int mid=(l+r)/2;
int i=0,j=0;
if(mid==0){
i=0;j=0;
}else{
i=(mid%n==0)?mid/n-1:mid/n;
j=(mid%n==0)?n-1:mid-i*n-1;
}
if(matrix[i][j]==target)
return true;
if(matrix[i][j]<target)
l=mid+1;
else if(matrix[i][j]>target)
r=mid-1;
}
return false;
}
}