import java.util.ArrayList;
import java.util.LinkedList;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size)
{
ArrayList<Integer> list = new ArrayList<Integer>();
if(num.length == 0 || num == null || size <= 0 || num.length < size){
return list;
}
int[] help = new int[num.length - size + 1];//辅助数组的长度,保存每三个的最大值
int index = 0;
LinkedList<Integer> mq = new LinkedList<Integer>();
for(int i = 0;i < num.length;i++){
while(!mq.isEmpty() && num[mq.peekLast()] <= num[i]){//保证双端队列的头部一直保存最大值
mq.pollLast();
}
mq.offerLast(i);//进入双端队列的都是坐标而不是值
if(i - size == mq.peekFirst()){//窗口中的数字超过三个,只要一超过三个,就弹出第一个
mq.pollFirst();
}
if(i >= size - 1){//指针已经走过三个窗口,要开始收集每三个的最大值了
help[index++] = num[mq.peekFirst()];
}
}
for(int j = 0;j < help.length;j++){//将数组中的数字转存到list中
list.add(help[j]);
}
return list;
}
}