二分查找
普通二分查找,二分查找左边界(最左边的target),二分查找右边界(最右边的target)
(干货)
下面的链接算是网上讲的比较透彻的了,没有太多多余的步骤,比较适合理解。
https://www.cnblogs.com/kyoner/p/11080078.html
leetcode中对应的题目
https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
tips:
1)为什么左边界返回l,右边界返回r
答:最终需要返回的是mid
2)为什么返回 left 而不是 right?
答:返回left和right都是一样的,因为 while 终止的条件是 left == right。
查找左右边界的python代码。
def findl(nums: List[int], target: int):
n = len(nums)
l=0
r=n
while l<r:
mid = (l+r)//2
if nums[mid] == target:
r = mid
elif nums[mid] < target:
l = mid+1
else:
r = mid
#if (left == nums.length) return -1;
#return nums[left] == target ? left : -1;
if l == n:#指针停在最右边,一定没找到target
return -1
if nums[l] != target:#没找到target
return -1
return l
def findr(nums: List[int], target: int):
n = len(nums)
l=0
r=n
while l<r:
mid = (l+r)//2
if nums[mid] == target:
l = mid+1
elif nums[mid] < target:
l = mid+1
else:
r = mid
if l-1 == -1:#指针停在最左边,一定没找到target
return -1
if nums[l-1] != target:#没找到target
return -1
return l-1