双端队列实现单调队列
import java.util.ArrayDeque;
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
/**
* 双端队列实现单调队列
* 队列存储的是元素的索引
*/
Deque<Integer> deque = new LinkedList<>();
int[] res = new int[nums.length - k + 1];
int left = 0;
int right = 0;
while (right < nums.length){
/**
* 当队列长度小于k时,每次将数组元素入队时,和队列最后一个元素比较,只存储大的那个。这样队列中存放的就是一个单调递减的数组,队首元素最大
* 当队列长度等于k时,队首元素就是当前k区间的最大值,然后k区间右移。此时如果左边界是最大值,那就先要将队首出队,让第二大值成为新的队首,然后区间再右移
*/
while (!deque.isEmpty() && nums[right] > nums[deque.getLast()]){
deque.removeLast();
}
deque.add(right);
if (right - left + 1 == k){
res[left] = nums[deque.getFirst()];
/**
* 此时左边界是nums[left],队首是res[left]
*/
if (res[left] == nums[left]){
deque.removeFirst();
}
left++;
}
right++;
}
return res;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(k)
*/
https://leetcode-cn.com/problems/sliding-window-maximum/