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

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


队列与滑动窗口:LeetCode 题目“最近请求次数”算法解析

在数据结构与算法的学习过程中,队列和滑动窗口是两个非常重要的概念。队列是一种先进先出(FIFO)的数据结构,而滑动窗口则是一种处理数据流或序列的算法技巧。本文将以 LeetCode 上的“最近请求次数”问题为例,深入探讨如何使用队列和滑动窗口技术来解决算法问题。

问题背景

LeetCode 上的“最近请求次数”问题如下:

假设有一个网站,每次用户访问时都会记录下访问时间。请实现一个算法,返回在过去的 5 分钟内访问次数最多的请求次数。

示例:


输入:requests = [“2021-07-19T03:34:55Z”, “2021-07-19T03:35:01Z”, “2021-07-19T03:35:25Z”, “2021-07-19T03:35:28Z”, “2021-07-19T03:35:30Z”]


输出:3


解释:在过去的 5 分钟内,有 3 次请求。


解题思路

要解决这个问题,我们可以使用滑动窗口结合队列来实现。滑动窗口的核心思想是维护一个固定大小的窗口,窗口内包含最近一段时间的数据。在这个问题中,窗口大小为 5 分钟,即窗口内最多包含 5 个请求。

以下是解题步骤:

1. 使用一个队列来存储最近 5 分钟内的请求。

2. 遍历每个请求,将其加入队列。

3. 如果队列中的请求超出了 5 分钟的时间范围,将其移除。

4. 在每次遍历结束时,计算队列的长度,即为过去 5 分钟内的请求次数。

5. 维护一个变量来记录最大的请求次数。

代码实现

下面是使用 Python 实现的代码:

python

from collections import deque


from datetime import datetime

def maxRequests(requests):


将请求字符串转换为 datetime 对象


requests = [datetime.strptime(request, "%Y-%m-%dT%H:%M:%SZ") for request in requests]


初始化队列和最大请求次数


queue = deque()


max_count = 0


遍历每个请求


for request in requests:


将请求加入队列


queue.append(request)


如果队列中的请求超出了 5 分钟的时间范围,将其移除


while queue[0] < request - timedelta(minutes=5):


queue.popleft()


计算队列的长度,即为过去 5 分钟内的请求次数


current_count = len(queue)


更新最大请求次数


max_count = max(max_count, current_count)


return max_count

测试代码


requests = ["2021-07-19T03:34:55Z", "2021-07-19T03:35:01Z", "2021-07-19T03:35:25Z", "2021-07-19T03:35:28Z", "2021-07-19T03:35:30Z"]


print(maxRequests(requests)) 输出:3


总结

本文通过 LeetCode 上的“最近请求次数”问题,介绍了如何使用队列和滑动窗口技术来解决算法问题。在实际应用中,队列和滑动窗口可以广泛应用于处理数据流、窗口统计等问题。通过熟练掌握这些数据结构与算法,我们可以更好地应对各种编程挑战。