题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思想
①因为有序,所以二分查找。
②从上到下,从左到右,都是递增。但是把二维变成一维之后就不是递增的了
②行进行二分查找,确定在哪一行,再在行上确定是哪一列。
本来以为用非递归思想可以解决问题,但是会出现分叉,只能用递归。
情况一:在行上二分,若mid大于要查找的值,则在前半部分查找即可(当前行和下面的都大于该值)。
情况二:在行上二分,若mid小于要查找的值,有三种情况,可以在上面,可以在当前行,可以在下面。(比如上图,查找数字3,因此这也是为什么不能使用非递归的原因了),上面下面进行递归,当前行进行二次二分,确定具体位置,二次二分时可以先进行判断减少不必要操作。
代码
int findx(int target, vector<vector<int> > array,int low1,int high1,int X,int Y,int flag){
if(low1>high1) return false;
if(flag==1){
return true;
}
int mid1=(low1+high1)/2;
if(array[mid1][0]==target) {
flag=1;
return true;
}else if(array[mid1][0]>target){
return findx(target,array,low1,mid1-1,X,Y,flag);
}else{ //判断
if(array[mid1][Y-1]>=target){
//查找
int low2=0;
int high2=Y-1;
while(low2<=high2){
int mid2=(low2+high2)/2;
if(array[mid1][mid2]==target) {
flag=1;
return true;
}
if(array[mid1][mid2]>target){
high2=mid2-1;
}else{
low2=mid2+1;
}
}
}//查找失败,上下递归
return findx(target,array,low1,mid1-1,X,Y,flag)||findx(target,array,mid1+1,high1,X,Y,flag);
}
return false;
}
bool Find(int target, vector<vector<int> > array) {
int X=array.size();
if(X==0){
return false;
}
int Y=array[0].size();
if(Y==0){
return false;
}
int low1=0;
int high1=X-1;
return findx(target,array,low1,high1,X,Y,0);
}