剑指 Offer 53 - I. 在排序数组中查找数字 I

121 阅读1分钟

题目描述

统计一个数字在排序数组中出现的次数。

示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2

示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0

解题思路: 二分法

因为是在排序数组中查找, 所以我们可以通过二分法.

  1. 通过二分法在数组中找到等于target的最后一位
  2. 再次通过二分法在数组中找到小于target的第一位
  3. 根据步骤1,2找到的idx相减就是target的个数

示例代码:

def search(self, nums: List[int], target: int) -> int:
    l, r = 0, len(nums) - 1
    while l <= r:
        mid = (l + r) // 2
        if nums[mid] <= target:
            l = mid + 1
        else:
            r = mid - 1
    right = l
    if r >= 0 and nums[r] != target: # 如果第一次没找到target 可以提前返回
        return 0
    l = 0
    while l <= r:
        mid = (l + r) // 2
        if nums[mid] < target:
            l = mid + 1
        else:
            r = mid - 1
    left = r

    return right - left - 1