1. 问题背景与核心挑战
滑动窗口最大值是算法领域中一个经典问题,它要求我们在给定数组和固定大小的滑动窗口条件下,高效找出每个窗口位置的最大值。这个问题在LeetCode上编号为239,属于高频面试题,也是理解双端队列(deque)数据结构的绝佳案例。
在实际工程中,类似场景比比皆是:股票分析中的N日最高价、系统监控中的峰值流量统计、图像处理中的局部最大值提取等。这类问题的核心难点在于如何避免暴力解法导致的O(nk)时间复杂度(n为数组长度,k为窗口大小),转而实现更优的O(n)解法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法与性能瓶颈
最直观的解法是遍历每个窗口,通过内层循环找出当前窗口的最大值。这种方法虽然简单直接,但当数组长度较大时(如n=10^5),其时间复杂度O(nk)将变得难以接受。例如当k=n/2时,时间复杂度会退化到O(n^2),这在算法竞赛或生产环境中都是不可接受的。
python复制def maxSlidingWindow_naive(nums, k):
if not nums:
return []
return [max(nums[i:i+k]) for i in range(len(nums)-k+1)]
这种解法的主要问题在于没有利用窗口滑动时的重叠特性——相邻窗口有k-1个元素是重复的,但暴力解法每次都重新计算,造成了大量重复计算。
3. 最优解:双端队列法
3.1 算法核心思想
高效解法使用双端队列维护一个动态递减序列。队列中存储的是数组元素的索引,且对应元素值保持单调递减。这种设计可以保证队列头部始终是当前窗口的最大值,而后续元素则是"潜在"的未来最大值。
算法执行过程中,我们需要处理三种关键操作:
- 移除超出窗口范围的队首元素(维护窗口边界)
- 从队尾移除所有小于当前元素的索引(维护单调性)
- 将当前元素索引入队
- 记录窗口形成后的最大值(队首对应元素)
3.2 完整实现代码
python复制from collections import deque
def maxSlidingWindow(nums, k):
if not nums:
return []
result = []
q =
