解题思路
一次二分查找。将二维矩阵看作是一维数组。坐标关系
一维数组:position = n*row+col
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length;
if (m == 0)
return false;
int n = matrix[0].length;
//二分查找,定义左右指针
int low = 0;
int high = m * n - 1;
while (low <= high) {
int mid = (low + high) / 2;
//计算二维矩阵中对应的行列号,取出对应元素。
int MidRow = mid / n;
int MidCol = mid % n;
if (matrix[MidRow][MidCol] > target) {
high = mid - 1;
} else if (matrix[MidRow][MidCol] < target) {
low = mid + 1;
} else {
return true;
}
}
return false;
}
天然二段性,从右上方进行查询。
public boolean searchMatrix2(int[][] matrix, int target) {
int m = matrix.length;
int n = matrix[0].length;
if (m == 0)
return false;
int i = 0;
int j = n - 1;
while (true){
if(matrix[i][j]==target) return true;
//比右上的值大,则必然在下一行
else if (matrix[i][j]<target) i++;
//比右上的值大,则必然在该行的前列
else j--;
//最低要求i要小于m-1,但是之前已经i加一过了
if(i >= m || j< 0) break;
}
return false;
}