这题其实最简单的思路是直接循环,每个窗口都计算他的最大值,但是牛客过不了。。超时了。
然后就用了一个双端队列,存储目前的最大值。
双端队列的大小为size,有一个新数之后,添加进去,要是再一个新数,比他大,直接替换当前队列最末端的。如果来一个新数小,就不添加。但是要注意里面的数有期限,最多维持size次。
import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size)
{
ArrayList<Integer> result = new ArrayList<>();
Deque<Integer> deque = new LinkedList<>(); //双端队列
if(size == 0||num.length<size) return result;
for(int i=0;i<num.length;i++){
while(!deque.isEmpty()&&num[deque.getLast()]<num[i]){
deque.pollLast();
}
deque.addLast(i);
while(!deque.isEmpty()&&deque.getFirst()<=i-size){
deque.pollFirst();
}
if(i>=size-1){
result.add(num[deque.getFirst()]);
}
}
return result;
}
}