二维数组的查找(编程题目)

本文分析了二维数组查找的几种方法,包括暴力求解的O(nlgn)复杂度,利用行列有序性的技巧法实现O(n)复杂度,以及二维二分查找法的O(nlog4/3)复杂度。通过Python代码展示了具体实现,并解释了每种方法的思路和优劣。
摘要由CSDN通过智能技术生成


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

题目分析

  任何一道算法题,在拿到题目之后,都是首先从基础的题干入手,了不起我看不懂任何题干中的隐藏信息,我直接暴力求解,起码让自己有一定的思路,先能解决问题,对于笔试题目的编程,有可能由于测试用例的量级比较小,直接求解了。而且对于一般的问题(排除很明显的动态规划、或者贪心算法暗示,这种题目暴力法很可能达到指数复杂度)。最最最传统的暴力法没有意义,不做讲解,首先抓住题干中的行(列)内有序,大不了这个有序就可以使用二分查找,同时也要认清楚线性有序,有序基本上必然和二分查找分不开了。

暴力求解 O ( n l g n ) O(nlgn) O(nlgn)

  首先来讲解暴力求解,如上分析,这个暴力求解不是指 O ( n 2 ) O(n^2) O(n2)复杂度的暴力求解,大不了对行内使用二分查找,这样就可以把行内的查找复杂度降低到 O ( n l g n ) O(nlgn) O(nlgn),但是这样最致命的缺点就是还有一个题干的信息没有用到,这就是列内也是有序的。

python代码如下:
class SolutionForce():
    def Find(self, target, arrays):
        for array in arrays:
            if self.binaryFind1d(array, target, 0, len(array) - 1):
                return True
        return False

    def binaryFind1d(self,array1d,target,beg,end):
        # 这里只需要判断是否找到,一般二分查找返回的是索引
        mid=(beg+end)>>1 # 右移一位,相当于除二
        if target==array1d[mid]:
            return True
        if target<array1d:
            return self.binaryFind1d(array1d,target,beg,mid-1)
        else:
            return self.binaryFind1d(array1d,target,mid+1,end)

  核心代码是一个一维的二分查找,复杂度刚才分析过了,对一行进行查找是 O ( l g n ) O(lgn) O(lgn<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值