LeetCode题解之最近的请求次数

最近的请求次数

题目描述

写一个 RecentCounter 类来计算最近的请求。

它只有一个方法:ping(int t),其中 t 代表以毫秒为单位的某个时间。

返回从 3000 毫秒前到现在的 ping 数。

任何处于 [t - 3000, t] 时间范围之内的 ping 都将会被计算在内,包括当前(指 t 时刻)的 ping。

保证每次对 ping 的调用都使用比之前更大的 t 值。

示例 1:

输入:inputs = ["RecentCounter","ping","ping","ping","ping"], inputs = [[],[1],[100],[3001],[3002]]
输出:[null,1,2,3,3]

提示:

  1. 每个测试用例最多调用 10000 次 ping。
  2. 每个测试用例会使用严格递增的 t 值来调用 ping。
  3. 每次调用 ping 都有 1 <= t <= 10^9。

解题思路

首先得理解题目的意思,题目的要求是计算最近(3000毫秒)的请求数,也就是说 ping 方法会接收一个输入参数 t ,这个 t 表示现在的时间,要求返回离时间 t 最近 3000 毫秒之内的请求数。以上文所述的示例为例:

输入:[],输出:null。这个不用管,应该是进行初始化的工作。
输入:1,输出:1。离 1 最近 3000 毫秒的时间段为[0,1],因此请求数为 1。
输入:100,输出:2。离 100 最近 3000 毫秒的时间段为[0,100],因此算上之前时间 1 和现在的时间 100 的请求,总请求数为 2。
输入:3001,输出:3。离 3001 最近 3000 毫秒的时间段为[1,3001],因此总请求数为 3(分别为在 1,100,3001 时间的请求)。
输入:3002,输出:3。离 3002 最近 3000 毫秒的时间段为[2,3002],因此之前时间 1 的请求已经不能计算在内了,所以总请求数还是为 3。

理解了题意之后,这道题就比较好解了,因为它要过滤掉之前的请求,因此我们很容易就能想到利用队列这种先进先出的结构来进行过滤,把每次请求的时间存储在队列中,然后将最早一批请求的时间和当前时间进行对比,如果它在当前时间 3000 毫秒之前,就将该请求记录给移除,这样就能确保返回正确的请求次数了。

复杂度分析

  • 时间复杂度:O(n),其中 n 是 ping 的次数。
  • 空间复杂度:O(C),其中 C = 3000,因为队列中最多会存储 3000 条记录(每一毫秒请求一次)。

代码实现

class RecentCounter {

    Queue queue;

    public RecentCounter() {
        queue = new LinkedList();
    }
    
    public int ping(int t) {
        queue.add(t);
        while (queue.peek() < t - 3000) {
            queue.poll();
        }
        return queue.size();
    }
}

/**
 * Your RecentCounter object will be instantiated and called as such:
 * RecentCounter obj = new RecentCounter();
 * int param_1 = obj.ping(t);
 */

你可能感兴趣的:(LeetCode题解之最近的请求次数)