题目描述:
标签:队列 滑动窗口 单调队列 堆(优先队列)
给定一个数组
nums
和滑动窗口的大小k
,请找出所有滑动窗口里的最大值。
代码:
思路分析:
维护一个大小为k的大顶堆,每次将大顶堆的堆顶加入到list中,这里要注意的是想要移除队列中的某个元素只要使用queue.remove(该元素的值)即可。
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(k == 0 || nums.length == 0){
return new int[0];
}
ArrayList<Integer> list = new ArrayList<>();
PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2) -> o2 - o1);
for(int i = 0;i < k;i++){
queue.add(nums[i]);
}
list.add(queue.peek());
for(int i = 0, j = i + k;j < nums.length;i++, j++){
queue.remove(nums[i]);
queue.add(nums[j]);
list.add(queue.peek());
}
int[] ans = new int[list.size()];
int cnt = 0;
for(int num : list){
ans[cnt++] = num;
}
return ans;
}
}