239:
第一道hard题,花了很久。
从题解里了解到用单调队列来做,但一开始我用了queue而不是deque,然后也没有完全理解一个关键点:
添加新元素时要从尾到头比较,并且从尾移除所有比新元素小的元素,这样才能保证除了队列头以外的部分也都是从大到小。
举例说明:[1,3,1,2,0,5],k=3。当初始窗口开始滑动的时候队列为 3,1 并且需要加入2,我一开始是用queue,只能与头(也就是3)作比较,2<3,于是2就在1没有被移除的情况下加入了,使得队列变成 3,1,2 ,这就导致当窗口再次移动至[1,2,0],队列里移除3之后,队列(1,2)的头变成了1,这时再用peek取最大值的话就会获得错误的答案。
所以加入2的正确方法是从尾开始先跟1比较,2>1,移除1,再跟3比较,2<3,加入2,这样就能保证队列中正确的排序。
还有一个重点则是结果数组的大小,我一开始是先用ArrayList储存结果,最后再遍历放入一个同大小的数组。但其实只要new一个大小为 nums.length - k + 1 的数组就可以了。这道题每个窗口都有一个最大值,所以只要算出窗口的数量就可以了。这里的1代表初始窗口,nums.length - k 代表的是滑动后得到的所有数组。
347:
看题解之前想到了用map来记录每个数字的出现频率。看过题解之后用priority queue实现代码的时候遇到了些困难。
因为对pq的操作不太熟,所以花了点时间看怎么定义pq的comparator,然后还学习了用Entry来遍历map的方法。
操作了解了之后跟着思路实现代码还是比较容易的。