239. 滑动窗口最大值
解题思路
- 计算每一个滑动窗口的最大值 关键在于借助单调队列实现窗口
- 对于单调队列 尾部添加元素 头部删除元素
- 添加元素操作:从尾部开始循环对比 删除比当前元素小的元素
- 获取最大值元素 直接获取头部元素
- 删除元素操作 直接删除头部元素
class Solution {public int[] maxSlidingWindow(int[] nums, int k) {MonotonicQueue window = new MonotonicQueue();List<Integer> res = new ArrayList<>();for(int i = 0; i < nums.length; i++){if(i < k - 1){window.push(nums[i]);}else{window.push(nums[i]);res.add(window.max());window.pop(nums[i - k + 1]);}}int[] arr = new int[res.size()];for(int i = 0; i < res.size(); i++){arr[i] = res.get(i);}return arr;}class MonotonicQueue{private LinkedList<Integer> maxq = new LinkedList<>();public void push(int n){while(!maxq.isEmpty() && maxq.getLast() < n){maxq.pollLast();}maxq.addLast(n);}public int max(){return maxq.getFirst();}public void pop(int n){if(n == maxq.getFirst()){maxq.pollFirst();}}}
}