返回

算法解题:统计数字在排序数组中出现的次数

后端

使用二分搜索统计排序数组中数字出现的次数

在有序数据集中快速定位元素

在现实世界中,我们经常会遇到需要处理大量数据的场景,而这些数据通常都是按照某种顺序组织的,例如按时间、大小或字母顺序。在这种情况下,二分搜索算法是一种非常有用的工具,它可以帮助我们以高效的方式在有序数组中找到特定元素。

二分搜索的原理

二分搜索的工作原理有点像我们玩“猜数字”游戏。假设我们有一个包含 100 个数字的已排序数组,并且我们正在寻找数字 42。我们可以将搜索空间分成两半,通过比较中间数字 50 与目标数字 42,我们可以确定 42 位于数组的前半部分还是后半部分。然后,我们重复这一过程,将搜索范围缩小一半,直到找到目标数字或确定它不在数组中。

应用二分搜索统计元素出现次数

二分搜索不仅可以用来查找元素,还可以用来统计元素在数组中出现的次数。例如,我们有一个包含学生成绩的已排序数组,并且我们想知道有多少学生获得了 90 分。我们可以使用二分搜索找到第一个获得 90 分的学生,然后找到最后一个获得 90 分的学生,最后计算两个位置之间的差值,即可得到获得 90 分的学生数量。

代码示例

def count_k_in_sorted_array(arr, k):
    first_pos = find_first_position(arr, k)
    last_pos = find_last_position(arr, k)
    if first_pos == -1 or last_pos == -1:
        return 0
    else:
        return last_pos - first_pos + 1

def find_first_position(arr, k):
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] < k:
            left = mid + 1
        else:
            right = mid - 1
    if left >= len(arr) or arr[left] != k:
        return -1
    else:
        return left

def find_last_position(arr, k):
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] <= k:
            left = mid + 1
        else:
            right = mid - 1
    if right < 0 or arr[right] != k:
        return -1
    else:
        return right

复杂度分析

二分搜索算法的时间复杂度是 O(logn),其中 n 是数组的大小。这是因为在每次迭代中,搜索空间都会减半。由于统计元素出现次数需要进行两次二分搜索,因此算法的总时间复杂度为 O(2logn) = O(logn)。

常见问题解答

  • 什么是二分搜索?
    二分搜索是一种算法,用于在已排序数组中高效地查找元素。
  • 二分搜索如何统计元素出现次数?
    通过找到元素的第一个位置和最后一个位置,然后计算这两个位置之间的差值,可以得到元素出现次数。
  • 二分搜索的时间复杂度是多少?
    二分搜索的时间复杂度为 O(logn),其中 n 是数组的大小。
  • 二分搜索的应用场景有哪些?
    二分搜索广泛应用于各种需要在有序数据集中快速查找元素的场景,例如查找联系人列表中的姓名、查找商品目录中的产品等。
  • 我如何实现二分搜索?
    您可以使用上面提供的代码示例或参考其他在线资源来实现二分搜索算法。