代码随想录13|239滑动窗口最大值、347前K个高频元素

文章介绍了两种算法问题的解决方案:一是使用单调队列实现滑动窗口的最大值,二是利用优先级队列(小顶堆)找出数组中前k个高频元素。这两种方法都优化了时间复杂度,分别达到O(n)和O(nlogk)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 滑动窗口最大值

239. 滑动窗口最大值

暴力解法也可以找到最大值:时间复杂度O(n × k);

通过自己构造单调队列,实现只维护最大值,同时保证队里的元素数值是由大到小的。

2 前k个高频元素

347. 前 K 个高频元素

利用map统计每个数出现的频率,然后用sort排序(时间复杂度为O(nlogn));

我本来还想用map内部自动排序,后来想想才发现他是利用key排序的,而这里的key是nums数值。

使用优先级队列进行排序,只需要维护,前k个高频元素(时间复杂度为O(nlogk))

本题利用小顶堆,因为要统计最大前k个元素,只有小顶堆每次将最小的元素弹出,最后小顶堆里积累的才是前k个最大元素。

因为是从小到大,所以最后要通过倒序对结果集进行赋值,出来才是从大到小

优先级队列priority_queue:(默认情况下是大顶堆)

大顶堆:进入队列之后,从大到小

小顶堆:进入队列之后,从小到大

优先级队列(priority_queue),不满足先进先出的条件,更像是数据类型中的“堆”。优先级队列每次出队的元素是队列中优先级最高的那个元素,而不是队首的元素。这个优先级可以通过元素的大小等进行定义。
大顶堆优先级就是大值,小顶堆优先级就是小值
  • 使用基本数据类型时,只需要传入数据类型,默认大顶堆,即less<>

  • 使用自定义的数据类型的时候,可以重写比较函数,也可以进行运算符重载(less重载小于“<”运算符,构造大顶堆;greater重载大于“>”运算符,构造小顶堆)。

其实自带有pair<>进行比较的比较函数,但是先比较第一个元素,第一个相等比较第二个,而本题要实现的是根据value进行排序,所以要重写比较函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值