使用了单调队列,队列最长为size,队列的元素顺序是从大到小,因为一个元素位置靠前,并且值很小,那它就不可能被取到。
两个关系
if(当前元素位置-队首元素位置>=size)
队首元素出队
while(当前元素大于队尾元素)
队尾元素出队
代码如下;
//package Demo1;
import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size)
{
LinkedList<Integer>deque=new LinkedList<>();
ArrayList<Integer>list=new ArrayList<>();
int length=num.length;
if(size>length)
return list;//不是return null
if(size==0||length==0)
return list;
for(int i=0;i<size;i++){
/*if(deque.isEmpty()){
deque.offerLast(i);
continue;
}
多余了
*/
while (deque.isEmpty()==false&&num[deque.peekLast()]<=num[i]){//不要忘了判断为null
deque.removeLast();
}
deque.offerLast(i);
}
list.add(num[deque.peekFirst()]);
// System.out.println("size:"+size+" length:"+length);
for(int i=size;i<length;i++){
if(i-deque.peekFirst()>=size)
deque.removeFirst();
/* if(deque.isEmpty()){
deque.offerLast(i);
continue;
} 多余了会造成不能向list集合中添加元素*/
while (deque.isEmpty()==false&&num[deque.peekLast()]<=num[i]){
deque.removeLast();
}
deque.offerLast(i);
//System.out.println("list 元素:"+num[deque.peekFirst()]);
list.add(num[deque.peekFirst()]);
}
return list;
}
}