【LeetCode】三、队列相关:最近的请求次数

发布于:2024-07-01 ⋅ 阅读:(17) ⋅ 点赞:(0)

1、队列结构

先进先出
在这里插入图片描述
时间复杂度:

在这里插入图片描述
Java中,LinkedList集合可以当一个队列来用:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2、leetcode933:最近的请求次数

在这里插入图片描述

很逆天的题目描述,就是不同时间会有请求发来,现在需要计算t-3000和t闭区间之内的请求次数。

比如下面,1ms、100ms的时候分别进来两个请求,此时返回2,3001的时候再进来一个请求,[3001-3000,3001]的请求数量为3,3002的时候再进来一个请求,[3002-3000,3002]区间,1ms的请求就不算了,返回3

在这里插入图片描述

思路:用一个队列,每进来一个请求(或者说每入队一个时间t),就对比最先入队的元素,判断其是否出t-3000和t闭区间,是则不再题目的统计范围,移除。队列的长度,即为该区间里请求的次数。

class RecentCounter {

    LinkedList<Integer> queue;

    public RecentCounter() {
        queue = new LinkedList<>();
    }

    /**
     *
     * @param t 传入请求的时间
     * @return 返回[t-3000, 3000]闭区间的请求的数量,即队列长度
     */
    public int ping(int t) {
        queue.add(t);
        //peek拿到即将出队的元素(这就是来的最早的元素)
        //当传入的请求的时间减去3000大于将出队的元素时,移除即将出队的元素
        //如上面例子,3002进来时,3002 - 3000大于最开始的1,1出队,不再统计范围之内
        while(queue.size() > 0 && t - 3000 > queue.peek() ) {
            queue.pop();
        }
        return queue.size();
    }
}

测试:

public class P933 {
    public static void main(String[] args) {
        RecentCounter recentCounter = new RecentCounter();
        System.out.println(recentCounter.ping(1));      //1
        System.out.println(recentCounter.ping(100));    //2
        System.out.println(recentCounter.ping(3001));   //3
        System.out.println(recentCounter.ping(3002));   //3
        System.out.println(recentCounter.ping(3003));   //4
        System.out.println(recentCounter.ping(3200));   //4
    }
}

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到