编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
方法一:一次二分查找
由题目我们可以得出:如果把二维数组看成一维数组,那么他的元素是单调递增的。所以就可以让左指针指向一维数组的开始,右指针指向一维数组的结尾,那么mid=(r+l)/2;在一维数组中下标为mid的元素,放在二维数组当中就是[mid/n][mid%n]
下附代码:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m=matrix.size();//行数
int n=matrix[0].size();//列数
int l=0,r=m*n-1;
while(l<=r)
{
int mid=(r-l)/2+l;
int num=matrix[mid/n][mid%n];
if(num==target)
return true;
else if(num<target)
l=mid+1;
else
r=mid-1;
}
return false;
}
};
方法二:两次二分查找
先对每一行的第一个元素进行二分查找,找到最后一个小于等于target的的那一行,然后在那一行里查找。
但是我不太会第一次查找…….