239. 滑动窗口最大值
文档和视频讲解:代码随想录(programmercarl.com)
状态:ac
用时:1h
思路:一开始想的是在每次滑动时候,把新的值和目前最大值比较,比最大值大则成为新的最大值。滑动窗口里的最大值,可能因为在最左边而在下次移动自动移除,最新的最大值就变成了窗口中的原第二大的值。因此,不能用一个变量来维护最大值,而需要一个能进能出的容器来维护。 考虑滑动窗口本身的向左移动的先入先出的特性,使用队列来维护最大值。
在窗口移动的时候,当新值进入窗口,如果比队列中队尾的元素大,说明队尾的元素不可能成为后面窗口的最大值,所以弹出。新值继续和队尾元素比较,知道它比队尾元素小或者它成为最大值。窗口最大值的结果数组就是每次移动后队列中的队首。
代码:

图1
347.前 K 个高频元素
文档和视频讲解:代码随想录(programmercarl.com)
状态:未ac
用时:1.5h
思路:两个方法,一个堆排序,一个桶排序。堆排序,即在统计了各个数字出现的次数后,维护一个大小为k的小顶堆(为什么用小顶堆?因为每次弹出的都是最小的元素,最后树中余留下来的k个节点是最大的k个),来对数字次数进行排序。
桶排序,即统计出现次数和最大次数,为每个次数设置一个桶,存放出现那么多次数的数字。从次数最大的桶开始依次向前选择k个数字。
代码:

图2 堆排序

图3 桶排序