/**
* 自己的代码,先遍历行找到数据可能在的行,再在行内二分查找到数据,没有则return false
* 时间复杂度 O(logn + m)
* Runtime: 0 ms, faster than 100.00%
* Memory Usage: 38.5 MB, less than 29.70%
*/
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length, n = matrix[0].length, row = -1;
for (int i = 0; i < m; i++) {
if (target <= matrix[i][n - 1]) {
row = i;
break;
}
}
if (row == -1) {
return false;
}
int left = 0, right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (matrix[row][mid] == target) {
return true;
}
if (matrix[row][mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return false;
}
}
/**
* 完全二分查找的方法,先通过二分查找确定行,再通过二分查找确定是这一行的哪一个元素
* 时间 O(logn + logm)
* Runtime: 0 ms, faster than 100.00%
* Memory Usage: 38.7 MB, less than 19.15%
*/
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int r1 = 0, r2 = matrix.length - 1, c1 = 0, c2 = matrix[0].length - 1;
if (target < matrix[0][0] || target > matrix[r2][c2]) {
return false;
}
while (r1 < r2) {
int mid = (r1 + r2) / 2;
if (matrix[mid][c2] == target) {
return true;
}
if (matrix[mid][c2] > target) {
r2 = mid;
} else {
r1 = mid + 1;
}
}
while (c1 <= c2) {
int mid = (c1 + c2) / 2;
if (matrix[r1][mid] == target) {
return true;
}
if (matrix[r1][mid] > target) {
c2 = mid - 1;
} else {
c1 = mid + 1;
}
}
return false;
}
}