题解使用二分查找算法来找到目标成绩的左右边界索引。首先,left_bound函数寻找target应该插入的位置,即第一次出现的位置。right_bound函数则找到target+1应该插入的位置,即target最后一次出现的位置的后一位。通过计算right_bound(target+1) - left_bound(target)得到target的出现次数。如果target在数组中不存在,这两个函数返回的值将相同,因此结果为0。
时间复杂度: O(log n)
空间复杂度: O(1)
from typing import List
class Solution:
def search(self, nums: List[int], target: int) -> int:
# 使用left_bound函数找到target和target+1的左边界,计算两者之差得到target的出现次数
return self.left_bound(nums, target+1) - self.left_bound(nums, target)
def right_bound(self, nums, target):
# 初始化左右指针
lo = 0
hi = len(nums)-1
# 二分查找
while lo <= hi:
mid = lo + (hi - lo) // 2
if nums[mid] > target:
hi = mid - 1
elif nums[mid] < target:
lo = mid + 1
elif nums[mid] == target:
lo = mid + 1
# 返回左边界
return lo
def left_bound(self, nums, target):
# 初始化左右指针
lo = 0
hi = len(nums)-1
# 二分查找
while lo <= hi:
mid = lo + (hi - lo) // 2
if nums[mid] > target:
hi = mid - 1
elif nums[mid] < target:
lo = mid + 1
elif nums[mid] == target:
hi = mid - 1
# 返回右边界
return hi