import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size) {
ArrayList<Integer> list = new ArrayList<>();
if(num.length >= size && size != 0){
Deque<Integer> deque = new LinkedList<>();
for(int i = 0; i < size; i++){
while(!deque.isEmpty() && num[i] > num[deque.peekLast()]){
deque.pollLast();
}
deque.addLast(i);
}
for(int i = size; i < num.length; i++){
list.add(num[deque.peekFirst()]);
while(!deque.isEmpty() && deque.peekFirst() < (i-size+1)){
deque.pollFirst();
}
while(!deque.isEmpty() && num[deque.peekLast()] < num[i]){
deque.pollLast();
}
deque.addLast(i);
}
list.add(num[deque.pollFirst()]);
}
return list;
}
}