第一道困难题,本题思路:我们需要构造一个单调队列,来实现该队列的最大值永远在队列的最前面,当我们向队列里添加元素时,也就是窗口每次移动时,我们最需要poll来移除最前面的值,然后add用来添加新进来的值,最后返回peek就是我们需要的窗口内的最大值。
其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。
那么这个维护元素单调递减的队列就叫做单调队列,即单调递减或单调递增的队列。
那么我们就需要在poll的时候和add的时候来做条件的判断了,当我们在poll的时候我们要判断,当前要弹出的元素是否等于队列出口的值,如果相等则弹出,在add操作中,我们要循环判断,如果加入的元素比入口元素大,则弹出入口处的元素,知道要添加的元素前面都是比她大的元素即可。
上面就是单调队列的实现代码。
实现了这个单调队列之后,这道题就好写很多了,我们只需先将前k个元素存到res数组,然后依次遍历k到最后一个元素,反复调用poll,add,peek方法即可。
思路:首先我们需要一个hashmap来存储数组中的元素和他们出现的次数,这个肯定是第一步想到的,然后我们该怎么返回前k个高频元素呢?看了卡哥视频之后,我了解到要用优先级队列来实现,因为底层是大顶堆或小顶堆,这样就可以根据出现的次数来排序了,那么究竟是用大顶堆还是小顶堆呢,答案是小顶堆,因为我们从hashmap里向pq添加时,如果pq的元素个数大于k我们就弹出顶部元素,这样就能保证添加完元素后,前k个高频元素都在小顶堆里,之后就是倒序取出就可以了