LeetCode——933.最近的请求次数

100 阅读2分钟

最近的请求次数

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
    }
}
  1. 创建一个队列,用于存放该时间范围内的请求数;
  2. 通过构造函数进行队列的初始化;
  3. 将新的请求加入到队列中;
  4. 循环遍历队列中的元素,当请求不在时间范围内则将其弹出队列;
  5. 最后计算队列中元素的个数即为该时间范围内请求的次数。