239 Sliding Window Maximum (mono deque)
https://leetcode.com/problems/sliding-window-maximum/
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
int[] ans = new int[n-k+1];
Deque<Integer> deque = new ArrayDeque<>();
// 维护一个递减栈,每次更新后栈尾元素就是当前最大值,栈尾左边的元素不在栈中,
// 要么是因为超出windows,要么是因为没有栈尾大不能保证递减
// 而因为每次更新都会加进新的值,所以栈尾元素要么就是新值要么就是足够大没有被淘汰的旧值
for (int i = 0; i < n; i++) {
while (i >= k && !deque.isEmpty() && deque.peekLast() <= i-k) {
deque.pollLast();
}
while (!deque.isEmpty() && nums[deque.peek()] < nums[i]) {
//本质上就是说后来者有更大的,以后再怎么右移也不会轮到你们当最大值了
deque.poll();
}
deque.push(i);
if (i >= k - 1) {
ans[i - k + 1] = nums[deque.peekLast()];
}
}
return ans;
}
}Previous503 Next greater element IINext1438. Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit (mono deque)
Last updated