仅供个人学习使用
题目描述:
给你一个满足下述两条属性的 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;
}
}