算法题 最近的请求次数

933. 最近的请求次数

问题描述

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

实现RecentCounter类:

  • RecentCounter()初始化计数器,请求数为0。
  • int ping(int t)在时间t添加一个新的请求(t表示以毫秒为单位的时间),并返回过去3000 毫秒内(包括t时刻)发生的请求数。

保证每次调用ping时,t的值都比之前的值大。

示例

输入: ["RecentCounter","ping","ping","ping","ping"] [[],[1],[100],[3001],[3002]] 输出: [null,1,2,3,3] 解释: - ping(1) -> [1] -> 1个请求在[1-3000,1]范围内 - ping(100) -> [1,100] -> 2个请求在[100-3000,100]范围内 - ping(3001) -> [1,100,3001] -> 3个请求在[1,3001]范围内 - ping(3002) -> [1,100,3001,3002] -> 3个请求在[2,3002]范围内(1被排除)

算法思路

滑动窗口

  1. 使用队列存储所有请求的时间戳
  2. 每次调用ping(t)时:
    • 将当前时间t加入队列
    • 移除队列中所有不在[t-3000, t]范围内的旧请求
    • 返回队列的当前大小

代码实现

方法一:滑动窗口

importjava.util.Queue;importjava.util.LinkedList;classRecentCounter{privateQueue<Integer>requests;// 存储请求时间戳的队列privatestaticfinalintWINDOW_SIZE=3000;// 时间窗口大小/** * 构造函数:初始化RecentCounter */publicRecentCounter(){this.requests=newLinkedList<>();}/** * 在时间t添加请求,并返回过去3000毫秒内的请求数 * * @param t 请求时间戳(毫秒) * @return 过去3000毫秒内的请求数 */publicintping(intt){// 添加当前请求requests.offer(t);// 移除所有过期的请求(时间戳 < t - 3000)while(!requests.isEmpty()&&requests.peek()<t-WINDOW_SIZE){requests.poll();}// 返回当前窗口内的请求数returnrequests.size();}}

方法二:双端队列

importjava.util.Deque;importjava.util.ArrayDeque;classRecentCounter{privateDeque<Integer>requests;privatestaticfinalintWINDOW_SIZE=3000;publicRecentCounter(){this.requests=newArrayDeque<>();}publicintping(intt){requests.addLast(t);// 移除过期请求while(!requests.isEmpty()&&requests.getFirst()<t-WINDOW_SIZE){requests.removeFirst();}returnrequests.size();}}

算法分析

  • 时间复杂度
    • 单次ping操作:均摊 O(1)
    • 虽然有while循环,每个请求最多被加入和移除一次
  • 空间复杂度:O(W),W 是时间窗口内的最大请求数

算法过程

输入:[1,100,3001,3002]

  1. ping(1)

    • 队列:[1]
    • 有效范围:[1-3000, 1] = [-2999, 1]
    • 所有请求都有效,返回1
  2. ping(100)

    • 队列:[1, 100]
    • 有效范围:[100-3000, 100] = [-2900, 100]
    • 所有请求都有效,返回2
  3. ping(3001)

    • 队列:[1, 100, 3001]
    • 有效范围:[3001-3000, 3001] = [1, 3001]
    • 所有请求都有效(1 >= 1),返回3
  4. ping(3002)

    • 队列:[1, 100, 3001, 3002]
    • 有效范围:[3002-3000, 3002] = [2, 3002]
    • 请求1过期(1 < 2),移除后队列:[100, 3001, 3002]
    • 返回3

测试用例

publicstaticvoidmain(String[]args){// 测试用例1:标准示例RecentCounterrc1=newRecentCounter();System.out.println("Test 1:");System.out.println(rc1.ping(1));// 1System.out.println(rc1.ping(100));// 2System.out.println(rc1.ping(3001));// 3System.out.println(rc1.ping(3002));// 3// 测试用例2:密集请求RecentCounterrc2=newRecentCounter();System.out.println("\nTest 2:");for(inti=1;i<=5;i++){System.out.println(rc2.ping(i));// 1,2,3,4,5}// 测试用例3:稀疏请求(间隔很大)RecentCounterrc3=newRecentCounter();System.out.println("\nTest 3:");System.out.println(rc3.ping(1));// 1System.out.println(rc3.ping(4000));// 1 (1已过期)System.out.println(rc3.ping(8000));// 1 (4000已过期)// 测试用例4:边界情况RecentCounterrc4=newRecentCounter();System.out.println("\nTest 4:");System.out.println(rc4.ping(3000));// 1System.out.println(rc4.ping(6000));// 1 (3000刚好过期: 6000-3000=3000, 3000<3000)// 测试用例5:连续请求在边界RecentCounterrc5=newRecentCounter();System.out.println("\nTest 5:");System.out.println(rc5.ping(1));// 1System.out.println(rc5.ping(3001));// 2 (1仍在范围内: 3001-3000=1, 1>=1)System.out.println(rc5.ping(3002));// 2 (1过期: 3002-3000=2, 1<2)}

关键点

  1. 滑动窗口

    • 维护一个时间窗口[t-3000, t]
    • 动态添加新元素,移除过期元素
    • 队列大小就是窗口内的元素数量
  2. 单调性

    • 由于t严格递增,队列中的时间戳也是递增的
    • 过期元素总是集中在队列头部
    • 不需要检查队列中间或尾部的元素

常见问题

  1. 为什么不用数组或列表?
    • 数组/列表删除头部元素需要O(n)时间
    • 队列的poll()操作是O(1)的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1159614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本章节我们将讨论如何在 React 中使用表单。 DOM 元素有所不同

React 表单与事件 本章节我们将讨论如何在 React 中使用表单。HTML 表单元素与 React 中的其他 DOM 元素有所不同,因为表单元素生来就保留一些内部状态。在 HTML 当中&#xff0c;像 <input>, <textarea>, 和 <select> 这类表单元素会维持自身状态&#xff0…

ue 蓝图循环调用用法笔记

事件调完了&#xff0c;调用delay&#xff0c;然后再调用函数即可。

2026年AI智能体将重构工作:15大趋势深度解析,程序员必看指南

2026年AI智能体将从演示迈入"责任落地"时代&#xff0c;通过全工作流编排、多智能体协同和垂直专业化重构工作方式。企业需构建智能体操作系统&#xff0c;实现事实锚定与互操作性&#xff0c;应对安全与治理挑战。人类角色转型为智能体编排者&#xff0c;重点聚焦目…

阿里云渠道商:阿里云弹性伸缩混合管理指南

引言&#xff1a;在混合云架构成为主流的今天&#xff0c;企业常面临同时管理云上 ECS 实例和本地托管实例的挑战。阿里云弹性伸缩&#xff08;Auto Scaling&#xff09;通过智能资源调度&#xff0c;让您统一管理两类资源&#xff0c;实现成本与性能的最优平衡 —— 这正是 “…

牛津大学联合微软发布AUI-Gym,让AI成为UI界面的“设计师+评委“

这项由牛津大学的Kevin Qinghong Lin、新加坡国立大学的Siyuan Hu和微软的Linjie Li、Zhengyuan Yang、Lijuan Wang等研究者联合完成的研究发表于2025年11月&#xff0c;论文标题为"Computer-Use Agents as Judges for Generative User Interface"。感兴趣的读者可以…

小白前端别慌:搞懂JS内置可迭代对象,写代码不再手抖(附实战技

小白前端别慌&#xff1a;搞懂JS内置可迭代对象&#xff0c;写代码不再手抖&#xff08;附实战技小白前端别慌&#xff1a;搞懂JS内置可迭代对象&#xff0c;写代码不再手抖&#xff08;附实战技巧&#xff09;为啥for...of一用就报错&#xff1f;——先别骂浏览器&#xff0c;…

计算机深度学习毕设实战-基于python深度学习的拉链是否完好识别基于python深度学习的拉链是否完好识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【毕业设计】基于深度学习识别水面漂浮垃圾基于python-CNN深度学习识别水面漂浮垃圾

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

黑客自学指南:零基础入门网络安全,一篇直接通关

网络安全&#xff08;黑客&#xff09;自学篇&#xff0c;一文带你从零基础入门到精通&#xff01; 第一阶段&#xff1a;基础操作入门&#xff0c;学习基础知识 入门的第一步是学习一些当下主流的安全工具课程并配套基础原理的书籍&#xff0c;一般来说这个过程在1个月左右比…

数字永生安全:意识上载后的网络安全挑战

数字永生安全&#xff1a;意识上载后的网络安全挑战引言&#xff1a;数字化永生的技术愿景与安全困境随着脑机接口、神经映射和人工智能技术的飞速发展&#xff0c;“数字永生”已从科幻概念逐渐走向技术讨论的前沿。这一概念的核心在于将人类意识、记忆和人格特征从生物大脑中…

深度学习计算机毕设之基于python-CNN深度学习卷神经网络识别水面漂浮垃圾基于python-CNN深度学习识别水面漂浮垃圾

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

大模型入门到精通:2025中国行业发展报告,程序员必读指南

中国大模型行业2024年市场规模达294.16亿元&#xff0c;预计2026年将突破700亿元。行业竞争已从单点技术对决转向多维度体系化较量&#xff0c;形成CBDG四维生态&#xff08;消费者、企业、设备、政府&#xff09;。技术演进方向包括多模态融合、智能体化和具身智能。未来&…

2026最热AI技能:大模型开发学习指南,收藏不亏!

文章介绍AI大模型开发的高薪前景&#xff0c;鼓励程序员学习大模型、RAG、Prompt等技术提升竞争力。作者整理了包含4大模块的学习路线&#xff0c;帮助读者快速入门&#xff0c;把握AI机遇实现薪资跃迁&#xff0c;可通过微信免费获取完整学习资料。 AI 现在简直杀疯了&#xf…

2026年最全AI产品经理与大模型学习指南,附90天实战路径,2026年AI产品经理终极学习路线

文章详述AI产品经理学习路线&#xff0c;涵盖基础知识、AI技术、产品管理等核心技能。重点介绍大模型AI四阶段学习路径&#xff1a;初阶应用、高阶应用、模型训练和商业闭环。强调AI技术带来的竞争优势&#xff0c;提供免费学习资源&#xff08;思维导图、教程、实战项目&#…

深度学习毕设项目:基于python深度学习识别水面漂浮垃圾基于python-CNN深度学习识别水面漂浮垃圾

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Java实习模拟面试|蔚来汽车后台开发一面面经深度复盘:大文件导出防OOM、TTL线程池上下文传递、Spring AOP失效陷阱与二叉树路径和深度解析(全面优化版)

Java实习模拟面试&#xff5c;蔚来汽车后台开发一面面经深度复盘&#xff1a;大文件导出防OOM、TTL线程池上下文传递、Spring AOP失效陷阱与二叉树路径和深度解析&#xff08;全面优化版&#xff09;关键词&#xff1a;蔚来后台开发&#xff5c;大文件导出&#xff5c;TTL线程池…

从能跑到能用:大模型智能体技术演进与工程化实践

文章介绍了大模型智能体技术的演进历程&#xff0c;从LangChain的基础设施作用&#xff0c;到LangGraph引入状态管理实现稳定执行&#xff0c;再到Deep Agents提升任务成功率和自主性。三者分别让智能体"能动"、“稳定"和"聪明”&#xff0c;共同推动了从&…

【课程设计/毕业设计】基于python-AI深度学习训练识别草莓是否腐烂基于python-AI训练识别草莓是否腐烂

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

程序员必学!dbt+DataOps+StarRocks如何打造高效数据治理与实时分析体系

本文详细介绍了dbt、DataOps和StarRocks如何构建"三合一"数据体系&#xff0c;实现数据建模自动化、版本控制、血缘分析及质量测试。通过ELT框架重构传统ETL架构&#xff0c;结合Agile模式缩短交付周期&#xff0c;确保数据准确性&#xff0c;为企业提供高效数据治理…

收藏!AI大模型三大核心组件深度解析:从基础到实战,小白也能懂的MCP Server/Function Call/Agent指南

本文专为AI大模型入门开发者与程序员打造&#xff0c;深度拆解大模型应用落地的三大核心支柱&#xff1a;MCP Server&#xff08;被动式能力工具箱&#xff0c;提供标准化数据接口&#xff09;、Function Call&#xff08;轻量型功能扩展瑞士军刀&#xff09;、Agent&#xff0…