模板,找到某个元素,否则-1
l, r=0,len(nums)-1
while l<=r: #!注意这里是等于号
mid = l + (r-l)//2 #(1)防止l+r太大溢出,l+(r-l)>>2也行 (2)趋向于左边的值[1,2]中间为1
if target==nums[mid]:
return mid
elif target>nums[mid] #说明target在右区间:
l = mid+1
else:#在左区间
r = mid-1
return -1 # l=r都没找到(缩小区间聚焦在某一个值)后
左区间寻找
找最左边的target,否则-1
l, r=0,len(nums)-1
while l<r: #最后程序停在某个数字上(l==r)
mid = l+(r-l)//2#中间的值趋向左边的值
if target> nums[mid]:
l = mid +1 #右边的正常
else: # target == nums[mid] 还要往左边找
r = mid # 因为我们要关注左边的区间,如果找到了一个值,那么我们还要继续找左边的区域
return l if nums[l]==target else -1 #还要判断l==r的时候那个值
右区间寻找
找最右边的target,否则-1
l, r=0,len(nums)-1
while l<r: #最后程序停在某个数字上(l==r)
mid = l+(r-l+1)//2#注意!! 中间的值趋向右边的值,注意这个+1
if target < nums[mid]:
r = mid-1 #左边的正常
else: # target == nums[mid] 还要往右边找
l = mid # 因为我们要关注右边的区间,如果找到了一个值,那么我们还要继续找右边的区域
return r if nums[r]==target else -1 #还要判断l==r的时候那个值
总结
1. 左区间寻找l+(r-l)//2
2. 右区间寻找l+(r-l+1)//2
3. 关注某个区间,另外的一个区间正常缩小
4. 最后结束的时候l==r 需要额外判断这个数字
自己练习:
nums=[5,7,7,7,7,8,8,10] target =7
nums =[7,7,7,7,7,7] target = 7
nums=[5,7,7,7,7,8,8,10], target = 6