这个方法最坏的时间复杂度为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;
}
}
京公网安备 11010502036488号