import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int[] num, int size) {
Deque<Integer> deque = new LinkedList<>();
ArrayList<Integer> res = new ArrayList<>();
// judge first
if (num == null || num.length < size || size == 0) return res;
for (int i = 0; i < num.length; i++) {
while (!deque.isEmpty()) { // clear outdate
if (deque.peekFirst() < i - size + 1) deque.pollFirst();
else break;
}
if (deque.isEmpty()) deque.addLast(i);
else if (num[i] < num[deque.peekLast()]) {
//res.add(num[deque.peekLast()]);
deque.add(i);
} else {
while (!deque.isEmpty()) {
if (num[deque.peekLast()] < num[i]) {
deque.pollLast(); // clear small element
} else {
break;
}
}
deque.add(i);
//res.add(num[deque.peekLast()]);
}
if (i >= size-1) res.add(num[deque.peekFirst()]);
}
return res;
}
} 使用双端队列来保存滑动窗口最大值的下标:
1. 首先要判断队首元素是否超出了当前的滑动窗口,如果超过了,那么就清理掉;(此时是从前往后清理);
2. 根据队末元素和当前元素的大小进行比较:
2.1 如果队列是空的,可以直接加入当前元素的下标。
2.2 如果队列中的末尾元素大于当前元素,则将当前元素加入队尾;
2.3 如果队列中末尾元素小于当前元素,则从队尾循环删除小于当前元素的元素。
3. 如果满足了滑动窗口的大小,那么就可以添加元素到res这个list里面。

京公网安备 11010502036488号