(python)《剑指offer》面试题4:二维数组中的查找

题目

在一个二维数组中,每一行按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否有该整数,并返回索引。
例如,判断下列数组是否包含7,并返回索引
在这里插入图片描述
思路:
我们发现右上角的元素是该行的最大,该列的最小。若要查找的数字m,大于右上角数字n,说明这个数不在第一行,删除第一行;若m<n,说明这个数不在最后一列,删除最后一列。删除后更新右上角的元素。重复以上过程直到找到该数。
如下图所示流程,判断7是否在数组中
在这里插入图片描述
python实现如下:

#coding=utf-8
## 面试题4 二维数组中的查找
## 在一个二维数组中,每一行都按照从左到右递增的顺序排序;每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组是否有该元素。
def search_2d_array(array_2d, item):
    top = 0  #右上角元素的行索引
    right = array_2d.shape[1] - 1 #右上角元素的列索引
    if item > array_2d[-1, -1]:  #判断该数是否比数组最小的元素小
        print('exceed scope of array!', end=' ')
        return 
    if item < array_2d[0, 0]:#判断该数是否比数组最大的元素大
        print('too small!', end=' ')
        return 
    while top <= array_2d.shape[0] - 1 and right >= 0:
        if array_2d[top, right] > item:
            right -= 1 #更新列索引
            continue
        if array_2d[top, right] < item:
            top += 1 #更新行索引
            continue
        else:
            return True,[top, right]
    print('haven\'t this number', end=' ')
    return None

if __name__ == '__main__':
    import numpy as np
    two_d_array = np.array([[1, 2, 8, 9], 
                            [2, 4, 9, 12], 
                            [4, 7, 10, 13], 
                            [6, 8, 11, 15]])
    #测试用例
    items = [0, 7, 4.4, 16]
    for item in items:
   	    print(search_2d_array(two_d_array, item))

运行结果
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值