题目描述:
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
解题思路:
这就是二维的二分查找,先在最后一列二分查找,确定行,再在该行二分查找。
注意点:
两次二分查找略有不同
1.left < right or left <= right
2.right = mid or right = mid-1
以上两个细节都需注意,不然不仅会导致算法不对,程序还会陷入无尽的循环中。
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size(), n = matrix[0].size();
int top = 0, bottom = m-1;
while(top<bottom){
int mid = top + (bottom-top)/2;
if(matrix[mid][n-1]==target) return true;
if(matrix[mid][n-1] < target){
top = mid+1;
}else{
bottom = mid;
}
}
int left = 0, right = n-1;
while(left<=right){
int mid = left + (right-left)/2;
if(matrix[top][mid]==target) return true;
if(matrix[top][mid] < target){
left = mid+1;
}else{
right = mid-1;
}
}
return false;
}