数据结构与算法之 leetcode 队列最近请求次数优化 滑动窗口

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


队列最近请求次数优化(滑动窗口)——LeetCode算法解析

在处理大量请求时,如何高效地统计最近一段时间内的请求次数是一个常见的问题。在LeetCode中,有一个经典的题目叫做“队列最近请求次数”,它要求我们使用滑动窗口的方法来优化队列的请求次数统计。本文将围绕这一主题,深入解析滑动窗口算法,并给出相应的代码实现。

题目描述

假设有一个算法,它每次从队列中取出一个元素,然后计算这个元素和它之前所有元素的和。我们需要实现一个函数,该函数接收一个整数数组`requests`和一个整数`k`,表示请求的序列和窗口大小。函数需要返回一个数组,其中每个元素表示窗口内请求次数的累加结果。

滑动窗口算法原理

滑动窗口算法是一种高效处理序列数据的方法,它通过维护一个窗口来跟踪序列中的特定元素。在“队列最近请求次数”这个问题中,我们可以使用滑动窗口来维护一个大小为`k`的窗口,并实时更新窗口内请求次数的累加结果。

算法步骤:

1. 初始化一个空队列`window`和一个变量`sum`来存储窗口内请求次数的累加结果。

2. 遍历`requests`数组,对于每个请求:

- 如果窗口大小小于`k`,将请求加入队列`window`,并将请求值加到`sum`上。

- 如果窗口大小等于`k`,将请求加入队列`window`,并将请求值加到`sum`上,然后从队列头部移除一个元素,并从`sum`中减去该元素的值。

- 将当前窗口的累加结果`sum`添加到结果数组`result`中。

3. 返回结果数组`result`。

代码实现

下面是使用Python实现的滑动窗口算法:

python

def k_largest_numbers(requests, k):


from collections import deque


window = deque()


sum = 0


result = []



for request in requests:


if len(window) < k:


window.append(request)


sum += request


else:


sum += request


sum -= window.popleft()



result.append(sum)



return result

示例


requests = [1, 2, 3, 4, 2, 3, 1, 4, 5]


k = 3


print(k_largest_numbers(requests, k))


性能分析

- 时间复杂度:O(n),其中n是`requests`数组的长度。每个元素只被处理一次。

- 空间复杂度:O(k),队列`window`的大小最多为k。

总结

滑动窗口算法是一种高效处理序列数据的方法,特别适用于需要实时更新窗口内元素和的场景。在“队列最近请求次数”这个问题中,通过维护一个大小为k的窗口,我们可以快速计算出窗口内请求次数的累加结果。本文通过LeetCode的题目,详细解析了滑动窗口算法的原理和实现,并给出了相应的代码示例。希望这篇文章能够帮助读者更好地理解和应用滑动窗口算法。