这个方法最坏的时间复杂度为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; } }