📅  最后修改于: 2023-12-03 15:36:56.702000             🧑  作者: Mango
对于一个有序数组,中位数是指在排序后的数组中,处于数组中间的那个数。若数组长度为偶数,则中位数为中间两个数的平均数。现在有一个原始的数组 nums
,其中有一些元素需要删除。请编写一个函数,从 nums
中删除指定的元素,使得删除这些元素后,数组的中位数发生变化。若数组长度为偶数,则返回中间两个数的平均值。
在删除指定元素后,可以通过二分查找找到删除指定元素后的有序数组的中位数。具体而言,对数组进行排序,然后根据数组长度的奇偶性来计算中位数。
若数组长度为奇数,则中位数为排序后数组的中间位置上的数;
若数组长度为偶数,则中位数为排序后数组的中间两个数的平均数。
def findMedian(nums, val):
"""
计算删除元素 val 后的中位数
"""
nums.remove(val)
nums.sort()
n = len(nums)
mid = n // 2
if n % 2 == 0:
return (nums[mid - 1] + nums[mid]) / 2
else:
return nums[mid]
def medianAfterDeletion(nums, vals):
"""
删除指定元素 vals 后,计算数组中位数的变化
"""
res = []
for val in vals:
res.append(findMedian(nums.copy(), val))
return res
nums = [1, 2, 3, 4, 5]
vals = [3, 5]
print(medianAfterDeletion(nums, vals)) # [2.5, 2.0]
对于长度为 n
的数组,删除元素的时间复杂度为 $O(n)$,排序的时间复杂度为 $O(n\log n)$,因此对于本算法来说,时间复杂度为 $O(n^2\log n)$。由于使用了额外的空间来存储结果,空间复杂度为 $O(k)$,其中 $k$ 为需要删除的元素的个数。