二维数组中的查找( 数组)

题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

思想

①因为有序,所以二分查找。

②从上到下,从左到右,都是递增。但是把二维变成一维之后就不是递增的了


②行进行二分查找,确定在哪一行,再在行上确定是哪一列。

本来以为用非递归思想可以解决问题,但是会出现分叉,只能用递归。

情况一:在行上二分,若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);
}

猜你喜欢

转载自blog.csdn.net/hqh131360239/article/details/80884495