此处用到的数据结构是双端队列(详见百度)
双端队列里面存放的是数组中的下标,er而不是数组中元素的值。
import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size)
{
ArrayList<Integer> ans=new ArrayList<Integer>();
if(size==0)
return ans;
Deque<Integer> deque=new ArrayDeque<Integer>();
for(int i=0;i<num.length;i++){
if(!deque.isEmpty()){
// 如果队列头元素不在滑动窗口中了,就删除头元素
if(i>=deque.peekFirst()+size)
deque.pollFirst();
// 如果当前数字大于队列尾,则删除队列尾,直到当前数字小于等于队列尾,或者队列空
while(!deque.isEmpty()&&num[i]>num[deque.getLast()])
deque.pollLast();
}
deque.add(i);// 入队列
// 滑动窗口经过size个元素,获取当前的最大值,也就是队列的头元素
if(i+1>=size)
ans.add(num[deque.peek()]);
}
return ans;
}
}