Use binary search for those rows that might contains the target.
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.empty())
return false;
int m=matrix.size();
int n=matrix[0].size();
for(int i=0;i<m&&matrix[i][0]<=target;i++)
{
int l=0,r=n-1,mid=(l+r)/2;
if(matrix[i][r]<target)
continue;
while(l<=r)
{
if(matrix[i][mid]==target)
return true;
if(matrix[i][mid]<target)
l=mid+1;
else
r=mid-1;
mid=(l+r)/2;
}
}
return false;
}
};
You can also use the divide and conquer, the details can be found in http://m.blog.csdn.net/blog/Jeanphorn/47028041.
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.empty())
return false;
int m=matrix.size();
int n=matrix[0].size();
int i=0,j=n-1;
while(i<m&&j>=0)
{
if(matrix[i][j]==target)
return true;
if(matrix[i][j]>target)
j--;
else
i++;
}
return false;
}
};