思路:
1.如果这次窗口最右边的值num[right]大于等于上一次的max值,则令max=num[right];
2.否则如果这次num[right]小于上一次的max,
1)如果上一次窗口最左边的值恰好是max,则需要重新对整个窗口计算最大值。
2)如果不是的话,则这次窗口的最大值依然是上次窗口的最大值max
3.令此次窗口最大值为max,并加入到list中。

public ArrayList<Integer> maxInWindows(int [] num, int size) {
        ArrayList<Integer> list=new ArrayList<>();
        if(size==0 ||size>num.length){
            return list;
        }
        int left=0;//窗口最左边
        int right=size-1;//窗口最右边
        int max=getMax(num,left,right);//整个窗口的最大值
        list.add(max);//把最大值加入到list
        left++;//窗口右移
        right++;
        while(right<num.length){
            //如果这次窗口最右边的值num[right]大于等于上一次的max值,则令max=num[right];
            if(num[right]>=max){
                max=num[right];
            }else{//否则如果这次num[right]小于上一次的max
                if(max==num[left-1]){//如果上一次窗口最左边的值恰好是max,此时最大值不明了,重新计算。
                    max=getMax(num,left,right);
                }
            }
            list.add(max);
            left++;
            right++;
        }
        return list;
    }
    //计算窗口内的最大值
    public int getMax(int[] num,int l,int h){
        int max=num[l];
        for(int i=l+1;i<=h;i++){
            if(num[i]>max){
                max=num[i];
            }
        }
        return max;
    }