【A-剑指offer】04-二维数组中的查找特定数字 python实现

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

解题技巧(对于这个特殊的矩阵):
1-每次查找二维数组的右上角元素,进行区域的缩减(也可以查找左下角的元素)

  • 1.1-选择右上角元素:
    if 查找的数字 == 二维数组的右上角元素,找到,设置标记位结束
    if 查找的数字 > 二维数组的右上角元素,删除该元素所在的那一行
    if 查找的数字 < 二维数组的右上角元素,删除该元素所在的那一列

  • 1.2-选择左下角元素:
    if 查找的数字 == 二维数组的右上角元素,找到,设置标记位结束
    if 查找的数字 > 二维数组的右上角元素,删除该元素所在的那一列
    if 查找的数字 < 二维数组的右上角元素,删除该元素所在的那一行

2-右上角或者左下角元素的选择

  • 对于这个特殊的二维数组,选择相反的确定位置元素剔除,其他位置为不确定位置,需要进行查找的。一旦搜索的区域有重叠,行和列的遍历会变复杂,这是我们不希望看到的
    起始元素的选择
'''
Creat by HuangDandan
2018-08-23
dandanhuang@sjtu.edu.cn

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

关键:矩阵比较起始元素的厕

技巧:
1-返回列表的长度
list只支持len(), numpy.array同时支持len, size, shape, 注意看三者返回值的区别。
2-查找问题设置标记位flag


'''
#选择右上角元素
def Find1(target, array):
    #获得二维数组的行和列大小
    nCol = len(array[0])                        #列数
    nRow = len([a[0] for a in array])           #行数
    m = nRow-1
    n = nCol-1
    flag = False                                #标记位,找到标记为True
    #从二维数组的右上方元素进行比较,右上方是关键,其他三个角落开始,区域均有重叠
    i, j = 0, n
    while (i <= m) & (j >= 0):                  #易错,这里必须加括号
        if target == array[i][j]:
            flag = True
            break
        elif target > array[i][j]:
            i, j = i+1, j
        else:
            i, j = i, j-1
    return flag

#选择左下角元素
def Find2(target, array):
    #获得二维数组的行和列大小
    nCol = len(array[0])                        #列数
    nRow = len([a[0] for a in array])           #行数
    m = nRow-1
    n = nCol-1
    flag = False                                #标记位,找到标记为True
    #从二维数组的右上方元素进行比较,右上方是关键,其他三个角落开始,区域均有重叠
    i, j = m, 0
    while (i >= 0) & (j <= n):                  #易错,这里必须加括号
        if target == array[i][j]:
            flag = True
            break
        elif target > array[i][j]:
            i, j = i, j+1
        else:
            i, j = i-1, j
    return flag


if __name__ == "__main__":
    array1 = [[1,2],[2,4],[5,6],[7,9]]
    print(Find2(8, array1))
    # print([a[0] for a in array1])
    # nRow1 = len([a[0] for a in array1])
    # print(nRow1)
    # print(len([a[0] for a in array1]))












  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值