栈与队列part3

滑动窗口最大值

第一道困难题,本题思路:我们需要构造一个单调队列,来实现该队列的最大值永远在队列的最前面,当我们向队列里添加元素时,也就是窗口每次移动时,我们最需要poll来移除最前面的值,然后add用来添加新进来的值,最后返回peek就是我们需要的窗口内的最大值。

其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。

那么这个维护元素单调递减的队列就叫做单调队列,即单调递减或单调递增的队列。

那么我们就需要在poll的时候和add的时候来做条件的判断了,当我们在poll的时候我们要判断,当前要弹出的元素是否等于队列出口的值,如果相等则弹出,在add操作中,我们要循环判断,如果加入的元素比入口元素大,则弹出入口处的元素,知道要添加的元素前面都是比她大的元素即可。

037ea1f8be1849fca51aeab88f3388dc.png

 上面就是单调队列的实现代码。

实现了这个单调队列之后,这道题就好写很多了,我们只需先将前k个元素存到res数组,然后依次遍历k到最后一个元素,反复调用poll,add,peek方法即可。

2820b9bc924b4c129274cdeae3f0cf19.png

前k个高频元素

思路:首先我们需要一个hashmap来存储数组中的元素和他们出现的次数,这个肯定是第一步想到的,然后我们该怎么返回前k个高频元素呢?看了卡哥视频之后,我了解到要用优先级队列来实现,因为底层是大顶堆或小顶堆,这样就可以根据出现的次数来排序了,那么究竟是用大顶堆还是小顶堆呢,答案是小顶堆,因为我们从hashmap里向pq添加时,如果pq的元素个数大于k我们就弹出顶部元素,这样就能保证添加完元素后,前k个高频元素都在小顶堆里,之后就是倒序取出就可以了4b294c89cdc84832875cb5a3dea94d7a.png

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值