/**
* monotonic queue
* Runtime: 26 ms, faster than 91.62%
* Memory Usage: 51.1 MB, less than 95.83%
*/
/**
* monotonic queue
*/
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int[] res = new int[nums.length - k + 1];
LinkedList<Integer> queue = new LinkedList<>(); // to sotre and update the index of possible max value in the current window
for (int i = 0; i < nums.length; i++) {
while (!queue.isEmpty() && nums[queue.peekLast()] <= nums[i]) { // clear all the values in queue that is less than current value, as they are not possible to be the largest number in the current window
queue.pollLast();
}
while (!queue.isEmpty() && queue.peek() <= i - k) { // clear the values that are not included in the current window
queue.poll();
}
queue.offer(i); // add the current value as the tail of the queue
if (i >= k - 1) { // when a complete window is included
res[i - k + 1] = nums[queue.peek()];
}
}
return res;
}
}