美文网首页算法
LeetCode933.最近的请求次数

LeetCode933.最近的请求次数

作者: Timmy_zzh | 来源:发表于2021-07-22 21:17 被阅读0次
1.题目描述
  • 写一个 RecentCounter 类来计算特定时间范围内最近的请求。

    请你实现 RecentCounter 类:

    RecentCounter() 初始化计数器,请求数为 0 。
    int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。
    保证 每次对 ping 的调用都使用比之前更大的 t 值

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

解释:
RecentCounter recentCounter = new RecentCounter();
recentCounter.ping(1);     // requests = [1],范围是 [-2999,1],返回 1
recentCounter.ping(100);   // requests = [1, 100],范围是 [-2900,100],返回 2
recentCounter.ping(3001);  // requests = [1, 100, 3001],范围是 [1,3001],返回 3
recentCounter.ping(3002);  // requests = [1, 100, 3001, 3002],范围是 [2,3002],返回 3

提示:
1 <= t <= 109
保证每次对 ping 调用所使用的 t 值都 严格递增
至多调用 ping 方法 104 次
2.解题思路
  • 解法一:使用数组存储请求数据,数组大小为3002,并设置两个指针start,end,表示范围[t-3000,t]的下标值,

    • 当有新的请求到来时,使用end指针承载,end++,当超过数组大小时,end=0从头开始处理
    • 然后判断start指针的值是否在t-3000 范围内,如果小雨start++,并注意数组越界问题
    • 最后返回的结果是end - start的值,如果end<start;结果为 length+end - start
  • 2.1.数组解法

    public static class RecentCounter_v1 {
        private int[] count = new int[3002];
        private int start = 0, end = 0;

        public RecentCounter_v1() {

        }

        public int ping(int t) {
            //保存新请求值t
            count[end++] = t;
            if (end >= count.length) {
                end = 0;
            }
            //start的下标值不断右移
            while (count[start] < t - 3000) {
                start++;
                if (start >= count.length) {
                    start = 0;
                }
            }
            if (start > end) {
                return count.length - (start - end);
            }
            return end - start;
        }
    }
  • 2.2.队列数据结构解法
    /**
     * 2.解法二:使用队列数据结构保存数据
     * -先进先出
     * -新的请求数据入队列到队尾
     * -不断获取队头数据,判断是否在t-3000范围内,如果小于则队头数据不断出队
     * -最后的结果是队列的大小
     */
    public static class RecentCounter {

        private LinkedList<Integer> queue = new LinkedList<>();

        public RecentCounter() {

        }

        public int ping(int t) {
            queue.addLast(t);
            while (queue.getFirst() < t - 3000) {
                queue.removeFirst();
            }
            return queue.size();
        }
    }
3.总结
  • 解法总结
    • 在时间t时会发起一个请求,需要将该最新的请求进行保存到集合中,并且集合中之前所有的数据数据范围应该是[t-3000,t],所以对于小于t-3000的值需要进行删除
    • 使用队列进行数据存储,最新的请求数据入队列到队尾,再拿到队头元素进行比较,小于t-3000的值元素需要进行删除
  • 队列结构总结:
    • 先进先出,讲究先来后到

相关文章

网友评论

    本文标题:LeetCode933.最近的请求次数

    本文链接:https://www.haomeiwen.com/subject/pxqjmltx.html