**题目:**Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers in each row are sorted in ascending from left to right. Integers in each column are sorted in ascending from top to bottom.
思路:题目提供一个二维数组,这个数组的每一行是递增的,每一列是递增的,题目提供一个元素,要求你在这个二维数组中寻找某个元素,如果这个元素在这个数组内,则返回True,否则返回False.
在一个二维数组中寻找某个数,看看它是否存在这个二维数组中,可以选择O(n^2)的查找,找到就返回True。但是这样就会超时。所以就必须选择一种更快速的方式,考虑数组的一个特点,每行是递增的,每列是递增的。在一个有序的数组中查找一个数,不就可以采用二分查找吗?这样就将一个一维数组中查找元素的复杂度从O(n)变为O(logn)了,那么在这一题中同样可以采用这种方法。假设我判断出,这个元素可能在某一行中,那么在这一行中就可以采用O(logn)的查找方法。那么现在的问题就是如何判断,这个元素存在哪一行呢?既然对于某一列可以采用二分查找,那么在判断是否存在某一行的时候也可以采用二分查找呢?因为每一行都是单独递增的,但是仔细想想还是不对啊,某一行的最后一列的元素大小和它下一行的第一个元素大小是不确定的。既然不可以,那我就O(n)线性查找看看所找的目标看看是不是在这一行的范围内,如果在,那么再O(logn)查找。最后时间复杂度就变成O(nlogn)。代码如下所示
bool searchMatrix(vector<vector<int>>& matrix, int target)
{
int m=matrix.size();
if(m==0)
return 0;
int n=matrix[0].size();
for(int i=0;i<m;i++)
{
if(target<=matrix[i][n-1]&&target>=matrix[i][0])
{
int left=0;
int right=n-1;
int mid=0;
if(target==matrix[i][n-1]||target==matrix[i][0])
return 1;
while(left<=right)
{
mid=(left+right)/2;
if(matrix[i][mid]==target)
return 1;
else if(matrix[i][mid]<target)
{
left=mid+1;
}
else
right=mid-1;
}
}
}
return 0;
}