数据结构与算法之 leetcode 队列滑动窗口 最大值优化

数据结构与算法阿木 发布于 2025-07-12 6 次阅读


队列滑动窗口(最大值优化)在LeetCode中的应用

在数据结构与算法的学习过程中,滑动窗口是一种常见的算法思想,它广泛应用于解决数组、字符串、链表等数据结构的问题。在LeetCode等编程竞赛平台中,滑动窗口问题也是高频考点之一。本文将围绕队列滑动窗口(最大值优化)这一主题,结合LeetCode上的具体题目,深入探讨其实现原理和优化技巧。

概述

滑动窗口是一种通过维护一个固定大小的窗口,在遍历数据的过程中,动态调整窗口的起始位置,从而解决一系列问题的算法思想。在队列滑动窗口问题中,我们通常需要维护一个窗口,该窗口内的元素满足某种条件,例如窗口内的元素是递增的、窗口内的元素和不超过某个值等。

为了提高滑动窗口算法的效率,我们可以采用最大值优化的方法。这种方法利用了队列的特性,通过维护一个单调递减的队列,使得队列的头部始终是窗口内的最大值。这样,在每次窗口滑动时,我们只需关注队列的头部元素,从而避免了遍历整个窗口寻找最大值的过程。

实现原理

以下是一个简单的队列滑动窗口的实现原理:

1. 初始化一个空队列和一个窗口的起始位置。

2. 遍历数据,将每个元素加入队列。

3. 如果队列不为空且当前元素大于队列的尾部元素,则将队列的尾部元素出队。

4. 当窗口的起始位置到达队列的头部元素时,将队列的头部元素出队,并更新窗口的起始位置。

5. 每次窗口滑动后,记录窗口内的最大值。

LeetCode题目分析

题目一:最大子序和(LeetCode 53)

题目描述:给定一个整数数组 nums,找出一个序列,该序列的和最大,且长度为 k。

解题思路:使用队列滑动窗口(最大值优化)求解。

python

def maxSubArray(nums, k):


if not nums or k <= 0:


return 0

n = len(nums)


queue = []


max_sum = float('-inf')


for i in range(n):


移除窗口外的元素


if i >= k:


queue.pop(0)


移除小于当前元素的元素


while queue and nums[queue[-1]] < nums[i]:


queue.pop()


添加当前元素


queue.append(i)


计算窗口内的最大和


if i >= k - 1:


max_sum = max(max_sum, sum(nums[queue[0]:queue[0] + k]))


return max_sum


题目二:滑动窗口的最大值(LeetCode 239)

题目描述:给定一个整数数组 nums 和一个整数 k,找出滑动窗口中所有元素的最大值。

解题思路:使用队列滑动窗口(最大值优化)求解。

python

from collections import deque

def maxSlidingWindow(nums, k):


if not nums or k <= 0:


return []

n = len(nums)


queue = deque()


max_values = []


for i in range(n):


移除窗口外的元素


if i >= k:


queue.popleft()


移除小于当前元素的元素


while queue and nums[queue[-1]] < nums[i]:


queue.pop()


添加当前元素


queue.append(i)


记录窗口内的最大值


if i >= k - 1:


max_values.append(nums[queue[0]])


return max_values


总结

本文介绍了队列滑动窗口(最大值优化)在LeetCode中的应用。通过分析具体题目,我们了解了其实现原理和优化技巧。在实际编程过程中,我们可以根据具体问题选择合适的滑动窗口算法,并结合最大值优化等方法提高算法的效率。

在后续的学习中,我们可以继续探索滑动窗口算法在其他数据结构中的应用,例如链表、树等,以拓宽我们的算法视野。我们还可以尝试将滑动窗口算法与其他算法思想相结合,解决更复杂的问题。