class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m=matrix.size();
int n=matrix[0].size();
for(int r=0,c=n-1;(r<m)&&(c>=0);){
if(matrix[r][c]>target){
--c;
}else if(matrix[r][c]<target){
++r;
}else{
return true;
}
}
return false;
}
};
class Solution {
public:
bool find(vector<vector<int>>&v,int x1,int y1,int x2,int y2,int target){
if(x1>x2||y1>y2){
return false;
}
int midx=(x1+x2)>>1;
int midy=(y1+y2)>>1;
if(v[midx][midy]==target){
return true;
}
return (target<v[midx][midy])?(find(v,x1,y1,midx-1,y2,target)||find(v,midx,y1,x2,midy-1,target)):(find(v,x1,midy+1,x2,y2,target)||find(v,midx+1,y1,x2,midy,target));
}
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m=matrix.size();
int n=matrix[0].size();
return find(matrix,0,0,m-1,n-1,target);
}
};
class Solution {
public:
int help(vector<int>&row,int y1,int y2,int target){
int left=y1,right=y2;
while(left<=right){
int mid=(left+right)>>1;
if(row[mid]<=target){
left=mid+1;
}else{
right=mid-1;
}
}
return left-1;
}
bool find(vector<vector<int>>&v,int x1,int y1,int x2,int y2,int target){
if(x1>x2||y1>y2){
return false;
}
int midx=(x1+x2)>>1;
int tmpy=help(v[midx],y1,y2,target);
if((tmpy>=y1)&&(v[midx][tmpy]==target)){
return true;
}
return find(v,x1,tmpy+1,midx-1,y2,target)||find(v,midx+1,y1,x2,tmpy,target);
}
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m=matrix.size();
int n=matrix[0].size();
return find(matrix,0,0,m-1,n-1,target);
}
};