这个方法最坏的时间复杂度为o(size*num.length),最优为O(n)。核心思想是记录每一次窗口的最大值及所属下标,当窗口滑动时只需判断新加入的值是否比最大值大,之前的最大值有没有被滑出去。

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
        ArrayList<Integer> res=new ArrayList<>();
        if(num==null||size==0||num.length<size)return res;
        int tmp=0;
        int maxNum=num[0];
        for(int i=1;i<size;i++){
            if(num[i]>maxNum){
                tmp=i;
                maxNum=num[i];
            }
        }
        res.add(maxNum);
        int j=size;
        while(j<num.length){
            if(num[j]>=maxNum){
                maxNum=num[j];
                tmp=j;
            }else{
                if(j-size+1>tmp){
                    maxNum=num[j-size+1];
                    tmp=j-size+1;
                    for(int i=j-size+1;i<=j;i++){
                        if(num[i]>maxNum){
                              tmp=i;
                               maxNum=num[i];
                         }
                    }
                }
            }
            res.add(maxNum);
            j++;
        }
        return res;
    }
}