二分查找

二分查找:搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束。如果中间元素的值小于目标值,意味着目标值在右侧,反之在左侧。

题1:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。数组中无重复元素。

输入: [1,3,5,6], 2  输出: 1
def searchInsert(nums,target):
    #初始化边界值。在[l,r]这个区间查找目标值
    l=0
    r=len(nums)-1
    while l<=r:
        #初始化中间索引
        mid = (l+r)//2
        if nums[mid]==target:
            return mid
        #目标值在右侧。重置左边界 l
        elif nums[mid]<target:
            l = mid+1
        else:#目标值在左侧,重置右边界 r
            r = mid-1
    return l

nums =[1,3,5,6]
target = 5
print(searchInsert(nums,target))
nums = [1,3,5,6]
target = 2
print(searchInsert(nums,target))
def searchInsert(nums,target):
    n = len(nums)
    l,r,res=0,n-1,n
    while l<=r:
        mid =(l+r)//2
        if nums[mid]>=target:
            r = mid-1
            res = mid
        else:
            l = mid+1
    return res

题2:计算并返回 x 的平方根,其中 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

         输入: 8  输出: 2   说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

def mySqrt(x):
    l,r,res=0,x,-1
    while l<=r:
        mid =(l+r)//2
        if mid**2<=x:
            res = mid
            l=mid+1
        else:
            r = mid-1
    return res

x = 8
print(mySqrt(x))

总结:注意比较题1和题2 res的初始值和 if 语句。题1在一个有序数组中找第一个大于等于 target的下标,res初始值设置为n。

          题2是向下取整,找一个小于等于target的下标,res初始值设置为 -1。

                

原文地址:https://www.cnblogs.com/yijierui/p/13326425.html