仅供个人学习使用
题目描述:
给你一个满足下述两条属性的 m x n 整数矩阵:
-
每行中的整数从左到右按非严格递增顺序排列。
-
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
示例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
题目解析:
因为矩阵具有单调性,所以可以将问题转化为一维数组的查找问题。具体步骤如下:
-
初始化:设置两个指针
low和high,分别指向矩阵的左上角(0,0)和右下角(m*n-1),其中m是矩阵的行数,n是矩阵的列数。 -
二分查找:在
low和high之间进行二分查找。- 计算中间位置
mid。 - 根据
mid计算出在矩阵中对应的元素x,即matrix[mid / n][mid % n]。这里mid / n计算出中间位置所在的行,mid % n计算出中间位置所在的列。
- 计算中间位置
-
比较与调整:
- 如果
x小于target,则将low指针移动到mid + 1,因为target一定在mid的右边。 - 如果
x大于target,则将high指针移动到mid - 1,因为target一定在mid的左边。 - 如果
x等于target,则返回true,表示找到了目标值。
- 如果
-
循环结束:如果
low超过了high,则表示没有找到目标值,返回false。
实现代码:
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m = matrix.length,n = matrix[0].length;
int low = 0,high = m * n -1;
while(low <= high){
int mid = (low + high)/2;
int x = matrix[mid / n][mid % n];
if(x < target){
low = mid + 1;
}else if(x > target){
high = mid - 1;
}else return true;
}
return false;
}
}



















