题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
样例描述
思路
二分法
- 想象成展开成一位数组,进行二分法搜索。
- 找到目标位置后进行一个坐标变化。
代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
if (matrix == null || matrix[0] == null) return false;
int m = matrix.length, n = matrix[0].length;
int l = 0, r = n * m - 1;
//对“想象中”展开成的一维数组进行二分,做一个左边变换即可
while (l < r) {
int mid = l + r >> 1;
//映射的行、列坐标 对列数一个除一个取模
if (matrix[mid / n][mid % n] >= target) r = mid;
else l = mid + 1;
}
return matrix[l / n][l % n] == target;
}
}