方法一暴力解决,方法二使用java的优先队列,维护一个大顶堆,同时判断堆顶的元素是不是在当前窗口内,若不在则移除堆顶直到堆顶位于当前窗口内,此时堆顶元素就是本窗口内的最大值。
import java.util.*;
public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size) {
        ArrayList<Integer> res=new ArrayList<>();
        int n=num.length;
        if(size>n||size==0){
            return res;
        }
//         int i=0;
//         int j=i+size-1;
//         while(i<n&&j<n){
//             int temMax=Integer.MIN_VALUE;
//             for(int k=i;k<=j;k++){
//                 if(num[k]>=temMax){
//                     temMax=num[k];
//                 }
//             }
//             res.add(temMax);
//             i=i+1;
//             j=i+size-1;
//         }
//         return res;
        PriorityQueue<int[]> pg=new PriorityQueue<>(new Comparator<int[]>(){
            public int compare(int[] a,int[] b){
                return b[0]!=a[0]?b[0]-a[0]:b[1]-a[1];}
        });
        for(int i=0;i<size;i++){
            pg.add(new int[]{num[i],i});
        }
        res.add(pg.peek()[0]);
        for(int i=size;i<n;i++){
            pg.add(new int[]{num[i],i});
            while(pg.peek()[1]<=i-size){
                pg.poll();
            }
            res.add(pg.peek()[0]);
        }
        return res;
    }
}