二维数组查找解题笔记

目标题目:

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
输入:
 7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:
 true


解题思路:

为了尽可能节省时间,首先我们先通过对比将不可能出现目标值的一部分数据排除掉。因为数组内的元素数据是以一定的顺序排列的,同一排左边小于右边,同一列上边小于下边,则可以以下列方法去掉不可能出现目标值的数据:
用目标值与第一排的数据进行二分查找并插入,找到目标值应当所在的位置,则目标值右边的矩形内的所有数据都不可能等于目标值:

目标值5小于6,则必定小于6右边和下边矩形范围内的所有数据


同样将目标值与第一列相比进行二分查找可排除下边的一定范围内的数据。接着将已经比较过的第一排和第一列也排除(如果在比较过程中发现了目标值则直接输出true),然后将剩下的数据作为一个新的二维数组继续进行上述步骤,直到找到目标值或排除所有数据。

代码:

bool Find(int target, vector<vector<int> > array) {
        int bottom=array.size();
        int right=array[0].size();
        int left=0;
        int top=0;
        while(bottom-top>1||right-left>1)
        {
            int l=left,r=right;
            while(r-l>1)
            {
                int mid=(r+l)/2;
                if(target<array[top][mid])
                    r=mid;
                else
                    if(target>array[top][mid])
                        l=mid;
                    else
                        return true;
            }
            right=r;
            int t=top,b=bottom;
            while(b-t>1)
            {
                int mid=(b+t)/2;
                if(target<array[mid][left])
                    b=mid;
                else
                    if(target>array[mid][left])
                        t=mid;
                    else
                        return true;
            }
            bottom=b;
            if(bottom-top<=1&&right-left<=1)
                if(target==array[top][left])
                    return true;
            top++;
            left++;
            if(bottom-top<=1&&right-left<=1)
                if(target==array[top][left])
                    return true;
        }
        return false;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值