编写一个高效的算法来判断 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
解题思路
两次二分,先竖着二分找到不大于目标元素的行,再在该行二分找有没有。
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int l =0,r = matrix.size()-1;
while(l<r){
int mid = (l+r+1)>>1;
if(matrix[mid][0]<=target){
l = mid;
}else{
r = mid -1;
}
}
int k = l;
l=0;
r = l + matrix[0].size()-1;
while(l<r){
int mid = (l+r+1)>>1;
if(matrix[k][mid]==target) return true;
if(matrix[k][mid]<target){
l = mid;
}else{
r = mid -1;
}
}
if(matrix[k][l]==target) return true;
else return false;
}
};