📅  最后修改于: 2023-12-03 14:55:35.299000             🧑  作者: Mango
给定一个由频率数组元素形成的数组,现在我们需要找到其中位数。
输入:
[1, 1, 2, 3, 4, 4, 5, 5, 5]
输出:
4
题目中给出的数组的元素是按照其出现的频率排序的。我们可以根据此特性来解决这个问题。
首先,我们需要把数组中的元素和它们的对应频率存下来。可以使用一个字典来实现。然后,我们按照频率从小到大排序,如果频率相同,就按其对应的元素值从小到大排序。排序之后,我们就可以得到按照从小到大排序的新数组。
接下来,我们需要计算新数组的中位数。中位数分为两种情况:
因此,我们需要判断排序后的数组的长度是奇数还是偶数,然后计算出其中位数即可。
def findMedian(arr):
freq = {}
for i in arr:
if i in freq:
freq[i] += 1
else:
freq[i] = 1
new_arr = sorted(freq.items(), key=lambda x: (x[1], x[0]))
n = len(new_arr)
if n % 2 == 0:
return (new_arr[n // 2 - 1][0] + new_arr[n // 2][0]) / 2
else:
return new_arr[n // 2][0]
时间复杂度:排序需要 O(nlogn) 的时间复杂度,因此整个算法的时间复杂度也是 O(nlogn); 空间复杂度:需要一个字典来存储每个元素的频率,因此空间复杂度为 O(n)。