74. 搜索二维矩阵
题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104
思路分析
典型的二分法问题。现在第一列中搜索,找到taget可能在的那一行,然后在这一行中再次进行二分搜索。
对于第一次二分搜索,结果偏向于往上,例如在题目给的例子中,要寻找11所在的行,找到的得是第二行而不能是第三行。因此设定了
mid=(left+right+1)/2,
left=mid,
right=mid-1
这种转移设定可以保证实现以上效果。
同样的
mid=(left+right-1)/2,
left=mid+1,
right=mid
可以实现结果偏于向下。
代码实现
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int top=0,bottom=matrix.size()-1;
while(top<bottom)
{
int mid=(top+bottom+1)/2;
if(matrix[mid][0]==target)
return true;
if(target>matrix[mid][0])
top=mid;
else
bottom=mid-1;
}
int left=0,right=matrix[0].size()-1;
while(left<right)
{
int mid=(left+right-1)/2;
if(matrix[top][mid]==target)
return true;
if(target>matrix[top][mid])
left=mid+1;
else
right=mid;
}
return matrix[top][left]==target;
}
};