import java.util.ArrayList;
import java.util.LinkedList;

public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
        ArrayList<Integer> list = new ArrayList<Integer>();
        if(num.length == 0 || num == null || size <= 0 || num.length < size){
            return list;
        }
        int[] help = new int[num.length - size + 1];//辅助数组的长度,保存每三个的最大值
        int index = 0;
        LinkedList<Integer> mq = new LinkedList<Integer>();
        for(int i = 0;i < num.length;i++){
            while(!mq.isEmpty() && num[mq.peekLast()] <= num[i]){//保证双端队列的头部一直保存最大值
                mq.pollLast();
            }
            mq.offerLast(i);//进入双端队列的都是坐标而不是值
            if(i - size == mq.peekFirst()){//窗口中的数字超过三个,只要一超过三个,就弹出第一个
                mq.pollFirst();
            }
            if(i >= size - 1){//指针已经走过三个窗口,要开始收集每三个的最大值了
                help[index++] = num[mq.peekFirst()];
            }
        }
        for(int j = 0;j < help.length;j++){//将数组中的数字转存到list中
            list.add(help[j]);
        }
        return list;
    }
}