LeetCode-74. 搜索二维矩阵
题目来源
题目详情
编写一个高效的算法来判断 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
-104 <= matrix[i][j], target <= 104
题解分析
解法一:二分法
- 根据本题的题意,我们可以观察到,当前行的第一个值是始终小于上一行的最后一个元素,因此,我们可以将所有的行拼接起来形成一个有序的一维数组。
- 因为拼接后的数组是升序的,所以我们可以使用二分法来查找target值。只不过,我们在获取mid所在的元素时,需要根据mid值求出行号和列号。
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int n = matrix.length;
int m = matrix[0].length;
int low = 0, high = n * m -1;
while(low <= high){
int mid = low + (high - low) / 2;
int midval = matrix[mid / m][mid % m];
if(target == midval){
return true;
}else if(target < midval){
high = mid - 1;
}else{
low = mid + 1;
}
}
return false;
}
}
Either Excellent or Rusty