Featured image of post Top K Frequent Elements

Top K Frequent Elements

347. 前K个高频元素

分析

  1. 统计频率:
    • 使用哈希表 hash 记录数组中每个元素的出现次数,键为数组元素,值为对应频率
  2. 统计频率分布:
    • 创建一个计数数组 count,其中 count[i] 表示频率为 i 的元素个数
  3. 确定频率阈值:
    • 从高频到低频累加 count,直到累计的元素数达到 k ,此时的频率即为筛选阈值 i
  4. 筛选元素:
    • 再次遍历哈希表 hash,将频率大于阈值 i 的元素加入结果数组 res

时间复杂度

  • 统计频率:O(n) ,遍历数组
  • 统计频率分布:O(m)m 为哈希表的大小
  • 筛选元素:O(m)

总复杂度:O(n + m) ,其中 m <= n

空间复杂度

  • 哈希表存储频率: O(m)
  • 频率分布数组:O(n)

总复杂度:O(n + m)

C++代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution
{
public:
    vector<int> topKFrequent(vector<int>& nums, int k)
    {
        // 1. 统计每个元素的频率
        std::unordered_map<int, int> hash;
        for (int num : nums)
            ++hash[num];

        // 2. 统计每个频率的出现次数
        int n = nums.size();
        std::vector<int> count(n + 1);
        for (std::pair<int, int> item : hash)
            ++count[item.second];

        // 3. 找到频率阈值
        int i = n, sum = 0;
        while (sum < k)
            sum += count[i--];

        // 4. 筛选出符合条件的元素
        std::vector<int> res;
        for (std::pair<int, int> item : hash)
            if (item.second > i)
                res.push_back(item.first);

        return res;
    }
};
Built with Hugo
Theme Stack designed by Jimmy