题意:一个矩阵,每一行都是升序,每一列都是升序。快速判断该矩阵是否有某个值。
我起初是这样做的,但是超时了。
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.empty()||matrix[0].empty()) return false;
return search(matrix,target,0,0,matrix.size()-1,matrix[0].size()-1);
}
bool search(vector<vector<int>>& matrix, int target,int x1,int y1,int x2,int y2){
if(x1>x2||y1>y2) return false;
int mx=(x1+x2)/2;
int my=(y1+y2)/2;
if(matrix[mx][my]==target) return true;
else if(matrix[mx][my]>target)
return search(matrix,target,x1,y1,mx-1,y2)||search(matrix,target,x1,y1,x2,my-1);
else return search(matrix,target,mx+1,y1,x2,y2)||search(matrix,target,x1,my+1,x2,y2);
}
};
后来对中间步骤进行了修改,让问题规模缩小的更快。这样才通过,330ms
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.empty()||matrix[0].empty()) return false;
return search(matrix,target,0,0,matrix.size()-1,matrix[0].size()-1);
}
bool search(vector<vector<int>>& matrix, int target,int x1,int y1,int x2,int y2){
if(x1>x2||y1>y2) return false;
int xx1=x1;
int yy1=y1;
int xx2=x2;
int yy2=y2;
while(xx1<=xx2&&yy1<=yy2){
int mx=(xx1+xx2)/2;
int my=(yy1+yy2)/2;
if(matrix[mx][my]==target) return true;
else if(matrix[mx][my]>target){
xx2=mx-1;
yy2=my-1;
}
else{
xx1=mx+1;
yy1=my+1;
}
}
return search(matrix,target,xx1,y1,x2,yy2)||search(matrix,target,x1,yy1,xx2,y2);
}
};
大意如图:
时间复杂度:
T(mn) = 2T(mn/4) + lg( min(m,n) )
即sqrt(mn)