import java.util.*;
public class Solution {
        public ArrayList<Integer> maxInWindows(int[] num, int size) {
            Deque<Integer> deque = new LinkedList<>();
            ArrayList<Integer> res = new ArrayList<>();
            
            // judge first
            if (num == null || num.length < size || size == 0) return res;

            for (int i = 0; i < num.length; i++) {
                while (!deque.isEmpty()) { // clear outdate
                    if (deque.peekFirst() < i - size + 1) deque.pollFirst();
                    else break;
                }
                if (deque.isEmpty()) deque.addLast(i);
                else if (num[i] < num[deque.peekLast()]) {
                    //res.add(num[deque.peekLast()]);
                    deque.add(i);
                } else {
                    while (!deque.isEmpty()) {
                        if (num[deque.peekLast()] < num[i]) {
                            deque.pollLast(); // clear small element
                        } else {
                            break;
                        }
                    }
                    deque.add(i);
                    //res.add(num[deque.peekLast()]);
                }
                if (i >= size-1) res.add(num[deque.peekFirst()]);
            }
            return res;
        }
    }

使用双端队列来保存滑动窗口最大值的下标:
1. 首先要判断队首元素是否超出了当前的滑动窗口,如果超过了,那么就清理掉;(此时是从前往后清理);
2. 根据队末元素和当前元素的大小进行比较:
    2.1 如果队列是空的,可以直接加入当前元素的下标。
    2.2 如果队列中的末尾元素大于当前元素,则将当前元素加入队尾;
    2.3 如果队列中末尾元素小于当前元素,则从队尾循环删除小于当前元素的元素。
3. 如果满足了滑动窗口的大小,那么就可以添加元素到res这个list里面。