Files
obsidian/АиСД/Задачи/LeetCode/Sliding Window Maximum.md
T
roma-dxunvrs 00b700a410 14.09.26
2026-09-14 20:07:06 +03:00

1.5 KiB

Leetcode #239 | #Hard | Монотонный стек | Монотонная очередь | Указатель на запись

Идея

Заводим деку для поддержания максимума. Идем по массиву, убираем элементы из деки, пока текущий больше. Кладем текущий в деку. Дальше избавляемся от "протухших" чисел в начале деки. Такие действия гарантируют, что в начале деки всегда лежит наибольший элемент текущего окна, добавляем его в ответ, если конечно окно уже нормального размера.

Big-O

  • Время O(N)
  • Память O(N)

Код

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int[] res = new int[nums.length-k+1];
        int write = 0;
        Deque<Integer> 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;
    }
}