• 二分查找


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

    题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。

                    

  • 相关阅读:
    Tempter of the Bone 搜索---奇偶性剪枝
    uestc 1709 Binary Operations 位运算的灵活运用
    uestc 1072 a ^ b
    uestc Another LCIS
    武汉邀请赛 Key Logger 双向链表
    bnu 29378 Adidas vs Adivon 基础题
    中南月赛F ZZY and his little friends
    日期问题
    开灯问题
    开灯问题
  • 原文地址:https://www.cnblogs.com/yijierui/p/13326425.html
Copyright © 2020-2023  润新知