这道题,思路挺不好想的。
一种方法是实现一个两个栈组成的队列,并且这个队列可以弹出最大值,但是这样的实现在面试过程中,太耗费时间,练习的时候可以试试,因此,这里介绍比较好写的方法。
首先,设置两个index作为窗口下标记录,每次将小于当前要加入窗口的数据从队列中剔除,在遇到大于该数据的时候,将该数据加入队尾。每一次遍历要确保窗口大小,也就是要将窗口外的数据移除。
要记住双端队列的使用
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums.length == 0){
return nums;
}
Deque<Integer> deque = new LinkedList<>();
int[] res = new int[nums.length - k + 1];
for(int count_l = 0,count_p = 1-k;count_l<nums.length;count_l++,count_p++){
if(count_p>0 && nums[count_p-1]==deque.peekLast()){
deque.removeLast();
}
while(!deque.isEmpty()&&deque.peekFirst()<nums[count_l]){
deque.removeFirst();
}
deque.addFirst(nums[count_l]);
if(count_p>=0){
res[count_p] = deque.peekLast();
}
}
return res;
}