解法一 two binary search O(logm)+O(logn)
class Solution {
public:
bool searchMatrix(vector<vector<int>> &matrix, int target) {
if(matrix.empty() || matrix[0].empty()) return false;
int n = matrix.size(), m = matrix[0].size();
// row (upper bound)
int l=0, r=n;
while(l<r){
int mid = l+(r-l)/2;
if(matrix[mid][0]<=target) l=mid+1;
else r=mid;
}
int row=0;
if(r-1<0) return false;
else row = r-1;
// col (classical)
l=0, r=m;
while(l<r){
int mid = l+(r-l)/2;
if(matrix[row][mid]==target) return true;
else if(matrix[row][mid]<target) l=mid+1;
else r=mid;
}
return false;
}
};
解法二 one binary search O(log(m+n))
class Solution {
public:
bool searchMatrix(vector<vector<int>> &matrix, int target) {
if(matrix.empty() || matrix[0].empty()) return false;
int n = matrix.size(), m = matrix[0].size();
//use classical binary search
int l=0, r=n*m;
while(l<r){
int mid = l+(r-l)/2, row = mid/m, col = mid%m;
if(matrix[row][col]==target) return true;
else if(matrix[row][col]<target) l=mid+1;
else r=mid;
}
return false;
}
};