最近的请求次数
1.题目链接
933. 最近的请求次数
2.原题描述:
写一个 RecentCounter 类来计算特定时间范围内最近的请求。
请你实现 RecentCounter 类:
RecentCounter() 初始化计数器,请求数为 0 。
int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。
保证 每次对 ping 的调用都使用比之前更大的 t 值。
3.相关算法
队列:
使用队列来存储请求的时间,每次调用ping方法时,将新的请求加入队尾,然后从队头开始遍历队列,将时间在 [t-3000, t] 内的请求计数,并将队头元素弹出,直到队列为空或者队头元素的时间不在 [t-3000, t] 范围内为止。
滑动窗口:
使用一个滑动窗口来存储时间范围在 [t-3000, t] 内的请求的数量。在每次调用 ping 方法时,先将队列中时间不在 [t-3000, t] 范围内的请求数量从窗口中减去,再将新的请求数量加入窗口,最后返回窗口中的请求总数。
4.本题主要思路
本题使用队列这个数据结构来解题,先创建一个队列,通过构造函数进行初始化,然后通过循环遍历,判断该元素是否是在该范围内,若不在则将其弹出队列,最后计算并返回队列中剩余元素的个数作为结果。
5.源码分析
class RecentCounter {
Queue<Integer> queue; // 1
public RecentCounter() {
queue = new ArrayDeque<Integer>(); // 2
}
public int ping(int t) {
queue.offer(t); // 3
while (queue.peek() < t - 3000) { // 4
queue.poll();
}
return queue.size(); // 5
}
}
- 创建一个队列,用于存放该时间范围内的请求数;
- 通过构造函数进行队列的初始化;
- 将新的请求加入到队列中;
- 循环遍历队列中的元素,当请求不在时间范围内则将其弹出队列;
- 最后计算队列中元素的个数即为该时间范围内请求的次数。