class Solution {
public:
bool searchMatrix(vector<vector<int> > &matrix, int target) {
int rowNum = insertPosition(matrix, target);
if(rowNum == -1)
return true;
else
return search(matrix, target, rowNum);
}
int insertPosition(vector<vector<int> > &matrix, int target)
{
int rows = matrix.size();
int left = 0;
int right = rows - 1;
while(left <= right)
{
int middle = left + ((right - left)>>1);
if(matrix[middle][0] == target)
return -1;
else if(target < matrix[middle][0])
right = middle - 1;
else
left = middle + 1;
}
if(right < 0)
return 0;
return right;
}
bool search(vector<vector<int> > &matrix, int target, int rowNum)
{
int cols = matrix[0].size();
int left = 0;
int right = cols - 1;
while(left <= right)
{
int middle = left + ((right - left)>>1);
if(target < matrix[rowNum][middle])
right = middle - 1;
else if(target > matrix[rowNum][middle])
left = middle + 1;
else
return true;
}
return false;
}
};
根据题意很自然的想到在纵向和横向分别使用二分查找,其中
纵向查找行号时,在没有找到元素时,需要找到比target小的最大数,也就是
其所在的行就是target有可能存在的行。另外要注意,函数insertPosition()中返回的
right,根据二分查找的规律来看就是要求的值,但对于right越界的情况需要单独处理