双指针向右滑动,然后遍历比较找出滑动窗口里面的最大值

public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
        ArrayList<Integer> res = new ArrayList<>();
        if(num.length < size || num.length == 0 || size < 1)
            return res;
        int l = 0;
        int r = size-1;
        while(r <= num.length-1){
            int max = num[l];
            for(int i = l; i <= r; i++){
                if(max < num[i])
                    max = num[i];
            }
            res.add(max);
            l++;
            r++;
        }
        return res;
    }

借助一个大顶堆,存储滑动窗口的元素,然后取堆顶的数即为滑动窗口的最大值,然后滑动窗口往下滑一个位置

public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
        PriorityQueue<Integer> maxQueue = new PriorityQueue<Integer>((o1,o2)->o2-o1); // 大顶堆
        ArrayList<Integer> res = new ArrayList<>();
        if(num.length < size || num.length == 0 || size < 1)
            return res;
        int index = 0;
        for(;index < size; index++)  // 先初始化第一个滑动窗口
            maxQueue.add(num[index]);

        while(index < num.length){  //当滑到最后一个时
            res.add(maxQueue.peek());  //堆顶即为最大
            maxQueue.remove(num[index-size]);  //移除掉滑动窗口第一个元素
            maxQueue.add(num[index]);  //加进去当前位置的元素
            index++;   
        }
        res.add(maxQueue.peek());  // 最后一个没放进去
        return res;
    }