Leetcode #239 | #Hard | [Монотонный стек](../../Методы/Монотонный%20стек.md) | [Монотонная очередь](../../Методы/Монотонная%20очередь.md) | [Указатель на запись](../../Методы/Указатель%20на%20запись.md) ## Идея Заводим деку для поддержания максимума. Идем по массиву, убираем элементы из деки, пока текущий больше. Кладем текущий в деку. Дальше избавляемся от "протухших" чисел в начале деки. Такие действия гарантируют, что в начале деки всегда лежит наибольший элемент текущего окна, добавляем его в ответ, если конечно окно уже нормального размера. ## Big-O - Время ```O(N)``` - Память ```O(N)``` ## Код ```Java class Solution { public int[] maxSlidingWindow(int[] nums, int k) { int[] res = new int[nums.length-k+1]; int write = 0; Deque deque = new ArrayDeque<>(); for (int r = 0; r < nums.length; r++) { while (deque.size() > 0 && nums[r] > nums[deque.peekLast()]) { deque.pollLast(); } deque.offerLast(r); while (r-deque.peekFirst() >= k) { deque.pollFirst(); } if (r+1 >= k) { res[write++] = nums[deque.peekFirst()]; } } return res; } } ```