题目描述
Write an efficient algorithm that searches for a value in an m x nmatrix. This matrix has the following properties:
- Integers in each row are sorted from left to right.
- The first integer of each row is greater than the last integer of the previous row.
For example,
Consider the following matrix:
[ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ]
Given target =3, returntrue.
解析:该数组的特点就是:行和列都是递增的,且上一行肯定小于下一行。所以,可以对行和列分别用二分查找法。先对行首元素进行二分查找,判断条件为:小于当前行首元素,且大于下行首元素,或者最后一行,确定所在行。再在本行使用二分查找法,确定是否存在目标值。
bool searchMatrix(vector<vector<int> > &matrix, int target)
{
int low=0,high=matrix.size();
int mid;
//对行首元素进行二分查找
while(low<=high)
{
mid=(low+high)/2;
if(matrix[mid][0]==target) return true;
if(matrix[mid][0]>target) high=mid-1;
if(matrix[mid][0]<target)
{
if(mid==matrix.size()-1||matrix[mid+1][0]>target)
break;//当检索到最后一行或者目标值小于本行,大于下一行
else
low=mid+1;
}
}
//确定行之后,对该行进行二分查找
low=1;high=matrix[0].size()-1;
int m;
while(low<=high)
{
m=(low+high)/2;
if(matrix[mid][m]==target) return true;
if(matrix[mid][m]>target) high=m-1;
if(matrix[mid][m]<target) low=m+1;
}
return false;
}