2021/01/23
题目描述
编写一个高效的算法来判断m x n矩阵中,是否存在一个目标值。该矩阵具有如下特性:
- 每行中的整数从左到右按升序排列。
- 每行的第一个整数大于前一行的最后一个整数。
分析
先对第一列进行二分搜索,确定 target 在哪一行,再对那一行进行二分搜索。
对列搜索的时候,注意 f(m) 应该取 arr[m] > target。
如果 f(m) = arr[m] >= target,需要对 l 进行大量讨论,导致代码变得非常复杂。
实现
class Solution {
public static boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length, n = matrix[0].length;
// 先搜索是哪一行
int l = 0, r = m;
while (l < r) {
int mid = l + (r - l) / 2;
if (matrix[mid][0] > target) {
r = mid;
} else {
l = mid + 1;
}
}
if (l == 0) return false;
// 否则可以确定行数,答案只可能在 l-1 行
int i = 0, j = n;
while (i < j) {
int mid = i + (j - i) / 2;
if (matrix[l - 1][mid] >= target) {
j = mid;
} else {
i = mid + 1;
}
}
if (i == n || matrix[l - 1][i] != target) return false;
return true;
}
}