剑指Offer [Python] | 1 二维数组中的查找

本文介绍了一种高效的二维数组查找算法,通过利用数组的排序特性,每次排除一行或一列来缩小查找范围,实现了快速查找。同时,提供了一个简单的暴力解法作为对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从今天开始攻克 「剑指Offer」。网络上众大神分享的思路及代码,大都已经非常仔细和清楚了。抱着学习的态度,开启「剑指Offer [Python] 」系列博文 —— 「转载」思路详细易懂的、python语言的众大神博文,加之对各方资料进行「整理 & 汇总」,「学习 & 对比」多种思路(i.e. 暴力解法 vs 快速解法)。

八月快来了,秋招要到了,一起加油拿下编程吧!✋

❤️ 「更多题目」

剑指Offer [Python] | 目录索引

  • 题目

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

一、快速解法
  • 思路
    首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数组,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列,这样每一步都可以缩小查找的范围,直到找到要查找的数字,或者查找范围为空。

  • 举例
    如果在一个二维数组中找到数字7,存在则返回True,如果没找到则返回False。

首先,8大于7,下一次只需要在8的左边区域查找;然后,5小于7,下一次只需要在5的下方区域查找;按照这种规则进行查找,如果查找到相同的,则返回True,否则返回False。
  • Python实现:
class Solution:
    def Find(self, target, array):
        rows = len(array)
        cols = len(array[0])
        if rows > 0 and cols > 0 :
            row = 0
            col = cols - 1
            while ( row < rows and col >= 0) :
                if target == array[row][col]:
                    return True
                elif target < array[row][col]:
                    col -= 1
                elif target > array[row][col]:
                    row += 1
                else:
                    return False

if __name__=='__main__':
    target=2
    array=[[1,2,3,4],[2,3,4,5],[3,4,5,6],[4,5,6,7]]
    solution=Solution()
    ans=solution.Find(target,array)
    print(ans)



来源:https://blog.youkuaiyun.com/qq_33487726/article/details/90715996
二、暴力解法
  • 思路
    遍历数组中所有元素
  • Python实现
class Solution:
    # array 二维列表
    def Find(self, target, array):
        # write code here
        for line in array:
            if target in line:
                return True
        return False
--------------------- 
作者:谓之小一 
来源:优快云 
原文:https://blog.youkuaiyun.com/xiaoyi_eric/article/details/81452014 
版权声明:本文为博主原创文章,转载请附上博文链接!
三、参考资料
  1. https://blog.youkuaiyun.com/qq_33487726/article/details/90715996
  2. https://blog.youkuaiyun.com/xiaoyi_eric/article/details/81452014
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值