33 lines
1.5 KiB
Markdown
33 lines
1.5 KiB
Markdown
Leetcode #239 | #Hard | [[Монотонный стек]] | [[Монотонная очередь]] | [[Указатель на запись]]
|
|
## Идея
|
|
Заводим деку для поддержания максимума. Идем по массиву, убираем элементы из деки, пока текущий больше. Кладем текущий в деку. Дальше избавляемся от "протухших" чисел в начале деки. Такие действия гарантируют, что в начале деки всегда лежит наибольший элемент текущего окна, добавляем его в ответ, если конечно окно уже нормального размера.
|
|
## [[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;
|
|
}
|
|
}
|
|
``` |