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 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, return true.
思路:二分法。将二维数组展开,想象成一维数组,然后确定中间元素的位置后就是一个典型的二分搜索问题。
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.empty()||matrix[0].empty()) return false;
int m=matrix.size(),n=matrix[0].size();
int low=0,high=m*n-1;
while(low<=high){
int mid=(low+high)/2;
int temp=matrix[mid/n][mid%n];
if(temp<target) low=mid+1;
else if(temp>target) high=mid-1;
else return true;
}
return false;
}
};