📅  最后修改于: 2023-12-03 15:07:34.251000             🧑  作者: Mango
给定一个升序排序数组和一个值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
出现的次数。函数主要分为三个部分:
x
在数组中的位置,并将位置保存在 mid
中。mid
开始往左、往右遍历数组,统计 x
的出现次数。x
的出现次数。本题使用二分法查找并计数,时间复杂度为 $O(log_2n)$。值得注意的是,在计数时往左、往右遍历数组的时间复杂度可能为 $O(n)$,但是因为数组已经排好序,所以该部分时间复杂度不会对整个算法的时间复杂度产生影响。