思路:
- 固定窗口
- 单调递减队列(队列头到队列尾)来维护区间最大值
这是一个降本增笑的故事:
如果新员工比老员工强(或者一样强),把老员工裁掉。(元素进入窗口)
如果老员工 35 岁了,也裁掉。(元素离开窗口)
裁员后,资历最老(最左边)(队列头)的人就是最强的员工了。
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
| class Solution { public int[] maxSlidingWindow(int[] nums, int k) { int l = 0, r = 0; List<Integer> res = new ArrayList<>(); Deque<Integer> dq = new ArrayDeque<>();
for (; r < nums.length; r++) { while (!dq.isEmpty() && nums[dq.peekLast()] < nums[r]) { dq.pollLast(); } dq.offerLast(r);
if (r - l + 1 < k) { continue; } res.add(nums[dq.peekFirst()]);
if (!dq.isEmpty() && dq.peekFirst() == l) { dq.pollFirst(); }
l++; }
return res.stream().mapToInt(Integer::intValue).toArray(); }
}
|