📌  相关文章
📜  国际空间研究组织 | ISRO CS 2015 |问题 13(1)

📅  最后修改于: 2023-12-03 15:07:34.251000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2015 |问题 13

问题描述

给定一个升序排序数组和一个值X,找到该值在数组中出现的次数。

示例

输入:

arr = [1, 1, 2, 2, 2, 2, 3] x = 2

输出:

4

解析

因为数组升序排列,我们可以使用二分法快速查找到值X在数组中的位置,并在数组中向左、向右遍历计算值X出现的次数。

代码实现
def countOccurrences(arr: list, x: int) -> int:
    n = len(arr)
    left, right = 0, n - 1
    mid = 0
    while left <= right:
        mid = (left + right) // 2
        
        if arr[mid] < x:
            left = mid + 1
        
        elif arr[mid] > x:
            right = mid - 1
        
        else:
            break
    
    count = 0
    i = mid - 1
    while i >= 0 and arr[i] == x:
        count += 1
        i -= 1
    
    i = mid
    while i < n and arr[i] == x:
        count += 1
        i += 1
    
    return count

代码中,函数 countOccurrences 接收两个参数,一个是升序数组 arr,一个是要查找的值 x。函数返回值为 x 出现的次数。函数主要分为三个部分:

  1. 二分查找:查找 x 在数组中的位置,并将位置保存在 mid 中。
  2. 计数:从 mid 开始往左、往右遍历数组,统计 x 的出现次数。
  3. 返回:返回 x 的出现次数。
总结

本题使用二分法查找并计数,时间复杂度为 $O(log_2n)$。值得注意的是,在计数时往左、往右遍历数组的时间复杂度可能为 $O(n)$,但是因为数组已经排好序,所以该部分时间复杂度不会对整个算法的时间复杂度产生影响。