题目描述
写一个 RecentCounter
类来计算最近的请求。
它只有一个方法:ping(int t)
,其中 t 代表以毫秒为单位的某个时间。
返回从 3000 毫秒前到现在的 ping
数。
任何处于 [t - 3000, t]
时间范围之内的 ping 都将会被计算在内,包括当前(指 t 时刻)的 ping。
保证每次对 ping
的调用都使用比之前更大的 t
值。
样例
输入: inputs = ["RecentCounter","ping","ping","ping","ping"],
inputs = [[],[1],[100],[3001],[3002]]
输出: [null,1,2,3,3]
注意
- 每个测试用例最多调用
10000
次ping
。 - 每个测试用例会使用严格递增的
t
值来调用ping
。 - 每次调用
ping
都有1 <= t <= 10^9
。
算法
(队列) $O(n)$
- 使用一个队列来存储当前有效的
ping
,当新来一个ping
请求时,首先将其加入队尾,然后从队首出队ping
小于t - 3000
的ping
请求。
时间复杂度
- 每个
ping
最多进队一次,出队一次,故均摊时间复杂度为 $O(n)$。
C++ 代码
class RecentCounter {
public:
queue<int> q;
RecentCounter() {
}
int ping(int t) {
q.push(t);
while (!q.empty()) {
if (q.front() >= t - 3000)
break;
q.pop();
}
return q.size();
}
};
/**
* Your RecentCounter object will be instantiated and called as such:
* RecentCounter* obj = new RecentCounter();
* int param_1 = obj->ping(t);
*/