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里面。