二维数组的搜索

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


# 首先完成 二分查找
def binary_search(array, num):
    length = len(array)
    mid = length // 2
    head = 0
    tail = length - 1
    while True:
        if num == array[mid]:
            print('the posi is {}'.format(mid))
            return True
        if head == mid:
            if num != array[tail]:
                print('No such number')
                return False
            else:
                print('the posi is {}'.format(tail))
                return True
        if num > array[mid]:
            print('bi find gt')
            head = mid
            mid = sum((tail, head)) // 2
        if num < array[mid]:
            print('bi find lt')
            tail = mid
            mid = sum((tail, head)) // 2


def with_in(array, num):  # 判断是否在行内
    print('with_ in running')
    return True if num >= array[0] and num <= array[-1] else False


def solution(array, num):
    # 首先确认这个数在二维矩阵的范围内:
    length = len(array)
    if num >= array[0][0] and num <= array[length - 1][-1]:
        print('number is in ')
        # 从中间行搜索处于哪一行, 原理和二分查找一样,只是判断逻辑时候使用一行的首尾来判断。
        mid = length // 2
        head = 0
        tail = length - 1
        print(head, mid, tail, array[mid], num)
        while True:

            if with_in(array[mid], num):
                print('in the mid ??')
                return binary_search(array[mid], num)

            if head == mid:
                return False if not with_in(array[tail], num) else True

            if num > array[mid][-1]:
                head = mid
                mid = sum((tail, head)) // 2
            if num < array[mid][-1]:
                tail = mid
                mid = sum((tail, head)) // 2
    else:
        print('the number is not within the scale')
        return False


l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
num = 9
solution(l, num)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值