首页 > 其他 > 详细

二分查找三种情况

时间:2020-05-26 14:07:23      阅读:58      评论:0      收藏:0      [点我收藏+]

根据搜索时区间的划分问题,将区间分为三种情况,下面为三种情况下对应的二分查找代码

def searchInsert(nums, target):
    ‘‘‘
    用二分查找来查找指定元素,将搜索区间分为三部分[left,mid-1],[mid]和[mid+1,right]
    :param nums:
    :param target:
    :return: 元素存在,返回index - 查找元素索引
            元素不存在,返回插入位置索引
    ‘‘‘
    left, right = 0, len(nums) - 1
    while (left <= right):  # 退出循环条件是left>right
        mid = left + (right - left) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return left


print("++++++++测试searchInsert==========")
nums = [1, 3, 5, 5, 5, 6]
target = 5
index = searchInsert(nums, target)
print(index=, index)


def SearchIndex(nums, target):
    ‘‘‘
    二分查找另一种实现,将搜索区间划分为两部分[left,mid]和[mid+1,right],此时mid下取整
    :param nums:
    :param target:
    :return:
    ‘‘‘
    left, right = 0, len(nums) - 1
    while (left < right):  # 退出循环条件是left==right,此时两者相等,对于返回左右边界就不用考虑了
        mid = left + (right - left) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1
        else:
            right = mid
    return -1


print(+++++++++测试SearchIndex()++++++++++)
nums = [-1, 0, 3, 5, 9, 12]
target = 2
index = SearchIndex(nums, target)
print(index=, index)


def searchIndex(nums, target):
    ‘‘‘
    二分查找,将区间分为[left,mid-1]和[mid,right]两部分,此时为了避免出现死循环(Left=mid),mid必须上取整
    :param nums:
    :param target:
    :return:
    ‘‘‘
    left, right = 0, len(nums) - 1
    while (left < right):  # 退出循环条件:left=right,不用考虑返回左右端点
        mid = left + (right - left + 1) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:  # 下一步搜索区间变为
            left = mid
        else:
            right = mid - 1
    return -1


print(------------测试searchIndex()-----------)
index = searchIndex(nums, target)
print(index=, index)
++++++++测试searchInsert==========
index= 2
+++++++++测试SearchIndex()++++++++++
index= -1
------------测试searchIndex()-----------
index= -1

Process finished with exit code 0

 

二分查找三种情况

原文:https://www.cnblogs.com/rounie/p/12964737.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!