思路

  • 3指针,定义个max指针,p指针,指针q=p-3+1,显然指针p,q可以合并。
    p: 0->len(num)
    max有两种情况
    • 如果指针p>max(是值大于),直接更新max=p
    • 如果指针q>max,那么遍历q到p,更新max为区间最大值
      其实类似牛客题解中的单调队列吧。相比建队列,指针法复杂度为o(1),时间复杂度相同

代码

import java.util.*;
public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {   ArrayList<Integer> arr=new ArrayList<>();
        if(size==0||size>num.length){return arr;}
        int max=0,p=0,q=p-size+1;
        while(p<num.length){
            if(num[p]>=num[max]){
                max=p;
            }
            if(q>max){
                max=q;
                for(int i=q;i<=p;i++){
                    max=num[i]>num[max]?i:max;
                }
            }
            // q>=0开始有滑动窗口了
            if(q>=0){
                arr.add(num[max]);
            }
            p++;
            q++;
        }
     return arr;
    }
}