import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int[] num, int size) {
ArrayList<Integer> res = new ArrayList<>();
LinkedList<Integer> queue = new LinkedList<>();//单调队列
for (int i = 0; i < num.length; i++) {
//保证队列的单调性,队头元素总是当前窗口的最大值 的下标
//如果队列尾元素小于当前元素则循环删除,保证队列的单调性
while (!queue.isEmpty() && num[queue.peekLast()] < num[i]) {
queue.pollLast();
}
//将当前元素加入队列
queue.addLast(i);
//先判断队头元素是否过期:即是否是当前窗口的值
while (i - queue.peekFirst() + 1 > size) {
queue.pollFirst();
}
//先判断当前窗口是否已满,再取当前窗口的最大值
if (i >= size-1) {
res.add(num[queue.peekFirst()]);
}
}
return res;
}
}