python数据结构剑指offer-二维数组中的查找

例题

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

给定 target = 3,返回 false。

数据范围:矩阵的长宽满足 0 \le n,m \le 5000≤n,m≤500 , 矩阵中的值满足 0 \le val \le 10^90≤val≤10
9

进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n+m)O(n+m)
示例1
输入:
7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
复制
返回值:
true
复制
说明:
存在7,返回true
示例2
输入:
1,[[2]]
复制
返回值:
false
复制
示例3
输入:
3,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
复制
返回值:
false
复制
说明:
不存在3,返回false

解决方案

问题分析:
找出某数是否在二维数组中,观察给出的示例,每一行都是从小排到大,那么我们为了节省查询效率,直接跟每一行最大的比
如果小于最大的,往前推,如果大于最大的,则直接进行下一行,减少查询次数

def find(target, array):
    # 行
    rows = 0
    # 因为每一个一维数组的长度都相同,那么直接用第一个数组的长度,python中数组的长度是定长,1,2,3就是3,但是我们数组是从0开始计数
    rows_len = len(array[0]) - 1
    # 判断循环
    flag = True
    # 用二维数组行来做循环
    while rows < len(array) and rows_len >= 0:
        # 拿到每一行最大的元素
        base = array[rows][rows_len]
        if target == base: # 如果恰好找到,就直接返回
            return True
        elif target > base: # 如果给出的数比每一个最大的还大,直接下一行查找
            rows += 1
        else: # 如果小于某一个最大的数,往前推推看
            rows_len -= 1
    return False

总结

遇到这种题,先观察示例,一般遇到二维数组,第一时间我就想到了for循环,但是当我看到时间复杂度和空间复杂度之后,就明白急不得

参考资料

https://github.com/nlpjoe/Coding4Interviews

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值