239. 滑動(dòng)窗口最大值
解題思路
- 計(jì)算每一個(gè)滑動(dòng)窗口的最大值 關(guān)鍵在于借助單調(diào)隊(duì)列實(shí)現(xiàn)窗口
- 對(duì)于單調(diào)隊(duì)列 尾部添加元素 頭部刪除元素
- 添加元素操作:從尾部開始循環(huán)對(duì)比 刪除比當(dāng)前元素小的元素
- 獲取最大值元素 直接獲取頭部元素
- 刪除元素操作 直接刪除頭部元素
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();}}}
}