当前位置: 首页 > news >正文

933. 最近的请求次数

最近的请求次数

  • 题目描述
  • 尝试做法
  • 推荐做法

题目描述

写一个 RecentCounter 类来计算特定时间范围内最近的请求。

请你实现 RecentCounter 类:

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

示例 1:

输入:
[“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

尝试做法

class RecentCounter {
    Queue<Integer> queue = new LinkedList<>();
    public RecentCounter() {
        while(!queue.isEmpty()){
            queue.poll();
        }
    }
    
    public int ping(int t) {
        int start = t - 3000;
        int ans = 0;
        queue.offer(t);
        while(queue.peek() < start){
            queue.poll();
        }
        return queue.size();
    }
}

这题挺适合用来复习队列操作的。

推荐做法

class RecentCounter {
    
    ArrayList<Integer> requests;

    public RecentCounter() {
        requests = new ArrayList<>();
    }
    
    public int ping(int t) {
        requests.add(t);
        int prev = bisectLeft(requests, t - 3000);
        return requests.size() - prev;
    }
    
    public int bisectLeft(ArrayList<Integer> requests, int target) {
        int left = 0;
        int right = requests.size();
        // [left, right)
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (requests.get(mid) >= target) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }
}

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

作者:负雪明烛
链接:https://leetcode.cn/problems/number-of-recent-calls/solutions/1472153/-by-fuxuemingzhu-ryxx/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

也可以用二分查找来做

相关文章:

  • 10个数据收集相关DeepSeek提示词
  • 机器学习神经网络中的损失函数表达的是什么意思
  • 基于SpringBoot + Vue 的房屋租赁系统
  • Java---JavaSpringMVC解析(1)
  • 【eNSP实战】配置NAPT(含动态NAT)
  • Java入职篇(2)——开发流程以及专业术语
  • 【C++项目】从零实现RPC框架「二」:项⽬设计
  • C++之文字修仙小游戏
  • 原理-事件循环
  • 数据炼丹与硬件互动:预测湿度的武学之道
  • 数据结构--图的基本操作
  • 系统稳定性建设
  • WVP前后端部署
  • WebSocket 使用教程:从原理到实践
  • 硬件驱动——51单片机:独立按键、中断、定时器/计数器
  • LinuX---压缩和解压类
  • stable-diffusion-webui-docker 构建 comfy-ui
  • 【极光 Orbit·STC8AH】04. 深度探索 GPIO 底层逻辑
  • clickhouse网络安全日志 网络安全日志保存时间
  • Python第四章07:continue 和 break 关键字控制循环 ( 中断与终止)
  • 以开放促发展,以发展促开放,浙江加快建设高能级开放强省
  • 媒体评教师拎起学生威胁要扔下三楼:师风师德不能“悬空”
  • 专访|《内沙》导演杨弋枢:挽留终将失去的美好
  • 中欧互动中的合作与分歧:务实需求将克服泛安全化的“政治钟摆”
  • 龚正会见哥伦比亚总统佩特罗
  • 共建医学人工智能高地,上海卫健委与徐汇区将在这些方面合作