class Solution {
2
public:
3
bool searchMatrix(vector<vector<int>>& matrix, int target) {
4
// 先折半定位第几行, 在折半定位第几行
5
if(matrix.size() == 0) return false;
6
int ymax=matrix.size(), xmax=matrix[0].size();
7
if(xmax==0 ) return false;
8
vector<int> firstcol(ymax);
9
for(int j=0;j<ymax;j++){
10
firstcol[j] = matrix[j][0];
11
}
12
int row=BinSearch(firstcol, 0, ymax-1, target);
13
int col=BinSearch(matrix[row], 0, xmax-1, target);
14
return matrix[row][col]==target;
15
16
}
17
18
int BinSearch(vector<int> a, int low, int high, int val){// 若找到则返回相应位置,没找到就是比待查元素小一点的位置
19
while(low<high){
20
int mid=(low+high)/2;
21
if(a[mid] == val ) return mid;
22
else if(a[mid] > val) high=mid-1;
23
else low=mid+1;
24
}
25
if(low==0) return low;
26
else return a[low] <= val ? low : low-1;
27
}
28
};
更为简单直接的方法:把整个矩阵看成一个线性表,但是复杂度O(log(mn))
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.empty() || matrix[0].empty()) return false;
int xmax=matrix[0].size(), ymax=matrix.size();
int low=0, high=xmax*ymax-1;
while(low<high){
int mid = (low+high)/2;
int e = matrix[mid/xmax][mid%xmax];
if(e == target) return true;
else if(e > target) high=mid-1;
else low = mid+1;
}
return matrix[low/xmax][high/xmax]==target;
}
};