class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int len = nums.length;
int[] ans = new int[len + 1 - k];
// 构造大顶堆,堆中元素对为<数组中的数, 索引>, 索引用于判断是否在窗口中
PriorityQueue<int[]> maxHeap = new PriorityQueue<>((o1, o2)->(o2[0] != o1[0] ? o2[0] - o1[0] : o2[1] - o1[1]));
for (int i = 0; i < k; i++) {
maxHeap.add(new int[]{nums[i], i});
}
ans[0] = maxHeap.peek()[0];
for (int i = k; i < len; i++) {
maxHeap.add(new int[]{nums[i], i});
// 当前的最大不在窗口中就删除
while (maxHeap.peek()[1] <= i - k) {
maxHeap.poll();
}
ans[i - k + 1] = maxHeap.peek()[0];
}
return ans;
}
}