Python 每日一题(二分法查找)

Python 每日一题:锻炼Python语法的运用,思维逻辑的锻炼,算法能力的培养。


题目:

    从有序数字列表中找到目标值,并返回其索引,如果目标值不在列表中,返回它可以按顺序插入的索引。

    输入:[3, 5, 6, 8, 9]  8

    输出:3

    输入:[1, 2, 6, 8, 9]  5

    输出:2

分析:

   1、定义两个变量:left  right,用于确定查找区间

   2、需循环判断 left <= right,计算出中间位置的索引值

        (1)如果中间值与目标值相同,则返回中间值,即为目标数的索引值。

        (2)如果中间索引值对应的数小于目标数,则查找区间左侧位置移动到中间位置向后的1个位置,否则查找区间右侧位置移动到中间位置向前的1个位置。

   3、如果在循环中没查找到目标值,则返回左侧的索引值,即为插入元素的索引值位置。

实现:

def search_insert_index(list_number, target):
    '''
        从有序列表中返回目标数的索引值
    :param list_number: list,目标数据列表
    :param target: int, 查找的目标数
    :return: int, 存在则返回元素的下标,不存在则返回插入的索引值位置
    '''
    left = 0
    right = len(list_number) - 1
    while left <= right:
        mid = (left + right) // 2
        if list_number[mid] == target:
            return mid
        elif list_number[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return left

L = [2, 4, 6, 7, 9]
print('结果为:', search_insert_index(L, 7))
print('结果为:', search_insert_index(L, 8))

结果:

结果为: 3
结果为: 4

结语以上整个程序的实现逻辑,还存在很多不全面的地方,欢迎各位大佬指点;如果觉得笔者不易,请给予点赞,给予我记录更多文章的动力!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值