首先要学习一个单调队列 自己理解了一下大概意思是:
如果要找滑动窗口中的最大值首先要让队列里的数变成单调的序列然后删除小的数(保留大的数)即可
如:
[1,3,-1,-3,5,3,6,7]
加入队列的过程为:
一:建立一个push的新函数 把小的数pop掉 大的数放进去
为什么会是removelast 删除队尾不删除对头呢?
因为要解决这样的情况 514 如果是删除队头只会跟5去比较 后面的数就放不进去了
这样就可以维护某个数在区间内一段时间的最大值 比如说 :1 3 -1 Max=3;3 -1 -3 Max=3;
二:建立一个pop元素模拟窗口移动
因为某个值在窗口中只能是一段时间内的最大值
当滑动窗口过了这个值 该最大值就要被pop出去
只要边缘移动到改值 就被pop掉
最后就把队头元素输出就行了
放入 nums[i-k] 是把窗口最左边的数删除(先判断再删除)
分为三步
收集数字的频率
for(int num:nums){
map.put(num,map.getOrDefault(num,0)+1);
}
对数字进行按频率排序
PriorityQueue<int[]> pq = new PriorityQueue<>((pair1, pair2)->pair2[1]-pair1[1]);
输出前k个数字
for(int i=0;i<k;i++){//依次从队头弹出k个,就是出现频率前k高的元素
ans[i] = pq.poll()[0];
}
整体代码为:
lamba表达式对于优先队列的排序不太熟练 要多练
(30条消息) Java优先队列/堆(PriorityQueue)中3种重写compare的方法_重写compare方法_hellosc01的博客-CSDN博客
(30条消息) 使用Lambda简化Comparator的使用_CrazyDragon_King的博客-CSDN博客
每日一题: