统计一个数字在排序数组中出现的次数。
思路:二分查找
具体思考过程见注释
def search_left_right(alist, target):
i, j = 0, len(alist) - 1
# 查找右边界
while i <= j:
mid = i + (j - i) // 2
if alist[mid] <= target:
i = mid + 1 # alist[mid]及其左边可能存在右边界
# else: alist[mid]严格大于target说明了,alist[mid]的右边没有target,即alist[mid]的右边不可能存在右边界
else:
j = mid - 1
right = i # 右边界是从左边开始找的
i, j = 0, len(alist) - 1
# 查找左边界
i, j = 0, len(alist) - 1
while i <= j:
mid = i + (j - i) // 2
if alist[mid] >= target:
j = mid - 1 # alist[mid]及其右边可能存在左边界
# else: alist[mid]严格小于target说明了,alist[mid]的左边没有target,即alist[mid]的左边不可能存在左边界
else:
i = mid + 1
left = j # 右边界是从左边开始找的
#return (left, right)
return right-left-1