二分查找:搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束。如果中间元素的值小于目标值,意味着目标值在右侧,反之在左侧。
题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 的平方根,其中 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。