本质上还是二分查找,只不过多了一步转化过程(将一维数组某位置转化到对应于二维数组的位置)
左闭右开区间搜索法:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m=matrix.size(),n=matrix[0].size();
int left=0,right=m*n;
while(left<right){
int mid=left+(right-left)/2;
if(get(matrix,mid)>target){
right=mid;
}else if(get(matrix,mid)<target){
left=mid+1;
}else{
return true;
}
}
return false;
}
int get(vector<vector<int>>& matrix, int index){
int m=matrix.size(),n=matrix[0].size();
int i=index/n;
int j=index%n;
return matrix[i][j];
}
左闭右闭区间搜索法:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m=matrix.size(),n=matrix[0].size();
int left=0,right=m*n-1;
while(left<=right){
int mid=left+(right-left)/2;
if(get(matrix,mid)>target){
right=mid-1;
}else if(get(matrix,mid)<target){
left=mid+1;
}else{
return true;
}
}
return false;
}
int get(vector<vector<int>>& matrix, int index){
int m=matrix.size(),n=matrix[0].size();
int i=index/n;
int j=index%n;
return matrix[i][j];
}
关于左闭右闭、左闭右开区间搜索法;二分查找寻找左边界、二分查找寻找右边界问题详述请看我的专栏:算法之二分查找理论(三种问题类型、两种算法形式)