关于力扣第239题的题解【滑动窗口最大值】

📅 2026/8/27 20:32:45
关于力扣第239题的题解【滑动窗口最大值】
摘要本文详细解析力扣第 239 题「滑动窗口最大值」的解法核心思路是采用滑动窗口 单调队列。遍历数组时我们维护一个双端队列Deque并始终保持队首为当前窗口的最大值。每当加入新元素前先移除队尾所有比它小的元素使队列保持单调递减同时剔除已滑出窗口的队首元素从而在 O(n) 时间内求出每个窗口的最大值。文中附有完整的 Java 代码实现并整理了 Deque 常用方法对照表帮助读者快速掌握单调队列的写法与原理。关于力扣第239题的题解【滑动窗口最大值】classSolution{publicint[]maxSlidingWindow(int[]nums,intk){int[]resnewint[nums.length1-k];DequeIntegerqueuenewLinkedList();for(inti0;inums.length;i){// ① 移除队尾所有比当前元素小的元素while(!queue.isEmpty()nums[queue.peekLast()]nums[i]){queue.pollLast();// 从队尾移除}// ② 将当前索引加入队尾queue.offerLast(i);// ③ 移除窗口外的队首元素if(queue.peek()i1-k){queue.poll();// 从队首移除}// ④ 记录窗口最大值if(i1k){res[i1-k]nums[queue.peek()];// 队首就是最大值}}returnres;}}本题使用的是滑动窗口队列的解法首先直接遍历整个数组当遇到一个当前元素比之前的元素大时这个元素一定是当前窗口的最大值那么就可以直接把之前的元素全都移除并将这个元素作为新的队尾元素。而当位于队友的元素也就是数组下标已经离开窗口范围的时候应该直接移除该元素并且之后最大的元素一定是队首【因为每次加入新元素时都会判断一次如果新元素大于队首就一定会把原来的队首移除如果没有顶替原来的队首那么新元素一定比队首小。】以下是队列的基础代码方法作用操作位置offerFirst(e)在队首插入元素头部offerLast(e)在队尾插入元素尾部peekFirst()查看队首元素不删除头部peekLast()查看队尾元素不删除尾部pollFirst()移除并返回队首元素头部pollLast()移除并返回队尾元素尾部offer(e)等同于offerLast(e)尾部peek()等同于peekFirst()头部poll()等同于pollFirst()头部isEmpty()判断队列是否为空—