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

题目描述

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

思想

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

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


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

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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值