栈与队列:TOP-K问题:前 K 个高频元素

本文探讨如何利用栈与队列解决找出数组中前K个高频元素的问题。首先介绍了粗暴的排序法,但由于时间复杂度较高,不适合。接着提出了一种更优的解决方案,通过哈希表统计频率,结合最小堆,保持堆中始终为频率最高的K个元素。这种方法的时间复杂度更优,并提供了相关代码实现和参考资料。
摘要由CSDN通过智能技术生成

栈与队列:TOP-K问题:前 K 个高频元素

在这里插入图片描述
解法一:粗暴排序法
最简单粗暴的思路就是 使用排序算法对元素按照频率由高到低进行排序,然后再取前 kk 个元素。

以下十种排序算法,任你挑选!
在这里插入图片描述
可以发现,使用常规的诸如 冒泡、选择、甚至快速排序都是不满足题目要求,它们的时间复杂度都是大于或者等于 O(n log⁡n)O(nlog⁡n),而题目要求算法的时间复杂度必须优于 O(n log n)O(nlogn)。

解法二:

  • 借助 哈希表 来建立数字和其出现次数的映射,遍历一遍数组统计元素的频率
  • 维护一个元素数目为 k 的最小堆
  • 每次都将新的元素与堆顶元素(堆中频率最小的元素)进行比较
  • 如果新的元素的频率比堆顶端的元素大,则弹出堆顶端的元素,将新的元素添加进堆中
  • 最终,堆中的 k 个元素即为前 k 个高频元素

对于优先队列的实现原理在这里,加强理解:点我跳转

代码如下:

class Solution {
   
public:
        class Com
        {
   
        public:
            bool operator ()(const pair<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值