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

Comments NOTHING