为啥要发明「单调队列」这种结构呢,主要是为了解决下面这个场景:
给你一个数组 window,已知其最值为 A,如果给 window 中添加一个数 B,那么比较一下 A 和 B 就可以立即算出新的最值;但如果要从 window 数组中减少一个数,就不能直接得到最值了,因为如果减少的这个数恰好是 A,就需要遍历 window 中的所有元素重新寻找新的最值。
LeetCode 139.滑动窗口最大值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| class MonotonicQueue { LinkedList<Integer> maxq = new LinkedList<>(); public void push(int n) { while (!maxq.isEmpty() && maxq.getLast() < n) { maxq.pollLast(); } maxq.addLast(n); } public int max() { return maxq.getFirst(); } public void pop(int n) { if (n == maxq.getFirst()) { maxq.pollFirst(); } } }
class Solution { int[] maxSlidingWindow(int[] nums, int k) { MonotonicQueue window = new MonotonicQueue(); List<Integer> res = new ArrayList<>(); for (int i = 0; i < nums.length; i++) { if (i < k - 1) { window.push(nums[i]); } else { window.push(nums[i]); res.add(window.max()); window.pop(nums[i - k + 1]); } } int[] arr = new int[res.size()]; for (int i = 0; i < res.size(); i++) { arr[i] = res.get(i); } return arr; } }
|