Files
obsidian/АиСД/Задачи/LeetCode/Sliding Window Maximum.md
T
roma-dxunvrs 0e6e583e6d
deploy / Pull and Restart (push) Successful in 17s
refactor: wiki links -> md links
2026-09-22 08:52:23 +03:00

33 lines
1.6 KiB
Markdown

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<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;
}
}
```