编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-10^4 <= matrix[i][j], target <= 10^4
思路
首先每行的数据从左到右依次增大,下面行的数据都比上面行的数据大。比起“杨氏矩阵”简单了一些。其中一种思路就是可以将二维矩阵转换为一维数组,然后根据一维数据的位置计算二维数组的位置。
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
// 获取矩阵的行数和列数
int m = matrix.length;
int n = matrix[0].length;
// 边界值考虑
if (target < matrix[0][0] || target > matrix[m - 1][n - 1]) {
return false;
}
// 二分查找
int left = 0, right = m * n - 1, mid;
while (left <= right) {
mid = (left+right) >> 1 ;
// 根据一维数组映射二维数组,mid/n就是这个数所在的行,mid % n就是这个数所在的列
int midVal= matrix[mid / n][mid % n];
if (target == midVal) {
return true;
} else if (target < midVal) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return false;
}
}
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:38.2 MB, 在所有 Java 提交中击败了11.09%的用户