剑指offer - 二维数组中的查找(python)

本文介绍了一种在特殊排序的二维数组中查找特定整数的方法,提供了四种不同的算法思路,包括循环嵌套、与行首尾比较、从左上角开始查找和与对角线比较,详细解析了每种方法的实现过程及效率。

题目描述

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

 

1、2两个笨办法。。

思路1:循环嵌套

# -*- coding:utf-8 -*-
class Solution:
    # array 二维列表
    def Find(self, target, array):
        # write code here
        for i in range(len(array)):# len(A)=4 行数row
            for j in range(len(array[i])):
                if target == array[i][j]:
                    return True
        return False

运行时间:421ms

占用内存:5752k

 

思路2:与每一行头尾作比较,然后与中间数比较

# -*- coding:utf-8 -*-
class Solution:
    # array 二维列表
    def Find(self, target, array):
        # write code here
        if len(array[0]) == 0:
            return False
        else:
            row = len(array)# 行数
            col = len(array[0])# 列数
            def equa(target, i):
                for j in range(1,col-1,1):# 搜索已定位到的行
                    if target == array[i][j]:
                        return True
                return False
            for i in range(row):
                if target>array[i][0] and target<array[i][col-1]:# 每行第一个数做比较,定位到所在行
                    if equa(target, i):
                        return True
                elif target==array[i][0] or target==array[i][col-1]:# 如果那个数就是第一个数
                    return True
            return False

运行时间:333ms

占用内存:5680k

 

思路3:从左上角开始找,大于则排除整列,左移一个数继续,小于则往下看,重复以上

找6的顺序如图:

# -*- coding:utf-8 -*-
class Solution:
    # array 二维列表
    def Find(self, target, array):
        # write code here
        if len(array[0])==0:# 二维数组为空
            return False
        else:
            i = 0
            j = len(array[0])-1
            while i<len(array) and j>=0:
                if target<array[i][j]:
                    j-=1
                elif target>array[i][j]:
                    i+=1
                else:
                    return True
            return False

运行时间:303ms

占用内存:5624k

 

思路4:与对角线做比较,再与确定位置后的左下角、右上角两块区域的数比较。

————————————————

图片来源:https://blog.youkuaiyun.com/u010005281/article/details/79804193

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值