📌  相关文章
📜  查找由给定元素频率形成的数组的中位数(1)

📅  最后修改于: 2023-12-03 14:55:35.299000             🧑  作者: Mango

查找由给定元素频率形成的数组的中位数

问题描述

给定一个由频率数组元素形成的数组,现在我们需要找到其中位数。

示例

输入:

[1, 1, 2, 3, 4, 4, 5, 5, 5]

输出:

4
解题思路

题目中给出的数组的元素是按照其出现的频率排序的。我们可以根据此特性来解决这个问题。

首先,我们需要把数组中的元素和它们的对应频率存下来。可以使用一个字典来实现。然后,我们按照频率从小到大排序,如果频率相同,就按其对应的元素值从小到大排序。排序之后,我们就可以得到按照从小到大排序的新数组。

接下来,我们需要计算新数组的中位数。中位数分为两种情况:

  1. 数组长度为奇数时,中位数为排序后的数组的中间元素;
  2. 数组长度为偶数时,中位数为排序后的数组中间两个元素的平均值。

因此,我们需要判断排序后的数组的长度是奇数还是偶数,然后计算出其中位数即可。

代码实现
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)。