题目来源:🔒LeetCode 362:敲击计数器
问题抽象: 设计一个 HitCounter 类,用于实时记录时间戳流中的敲击事件,并高效查询最近时间窗口内的敲击次数,满足以下核心需求:
-
核心操作:
- 记录敲击:
hit(timestamp)在整数时间戳timestamp记录一次敲击; - 查询计数:
getHits(timestamp)返回在时间区间(timestamp-300, timestamp]内的敲击总次数(即最近 300 秒内)。
- 记录敲击:
-
状态维护:
- 使用队列存储时间戳序列(或二元组
(ts, count)支持同秒多次敲击),按时间升序排列; - 维护全局计数器
total动态记录窗口内敲击总数; - 同时间戳的敲击合并计数(避免队列冗余)。
- 使用队列存储时间戳序列(或二元组
-
过期清理:
- 每次
getHits调用时,移除队列中所有ts ≤ timestamp-300的过期记录(更新total); hit操作时若当前时间戳与队尾相同,则累加计数(否则追加新节点)。
- 每次
-
边界处理:
- 初始状态:空队列,
total=0; - 时间戳跳跃:允许
hit时间戳非连续(如hit(1)后hit(100)); - 大跨度查询:若
timestamp距上次操作超 300 秒,队列清空; - 重复时间戳:
hit(100)后再次hit(100)合并计数。
- 初始状态:空队列,
-
计算约束:
- 时间复杂度:
hit和getHits均摊 O(1)(每个时间戳入队/出队各一次); - 空间复杂度:O(300)(队列最多存 300 秒的数据节点)。
- 时间复杂度:
类定义:
class HitCounter:

889

被折叠的 条评论
为什么被折叠?



