news 2026/7/10 5:01:23

经典算法实例应用:最近的请求次数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
经典算法实例应用:最近的请求次数

我们先来看题目描述:

写一个 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 次

解决方案

方法一:队列

思路和算法

我们可以用一个队列维护发生请求的时间,当在时间 t 收到请求时,将时间 t 入队。

由于每次收到的请求的时间都比之前的大,因此从队首到队尾的时间值是单调递增的。当在时间 t 收到请求时,为了求出 [t−3000,t] 内发生的请求数,我们可以不断从队首弹出早于 t − 3000 的时间。循环结束后队列的长度就是 [t−3000,t] 内发生的请求数。

代码

Python3

class RecentCounter: def __init__(self): self.q = deque() def ping(self, t: int) -> int: self.q.append(t) while self.q[0] < t - 3000: self.q.popleft() return len(self.q)

C++

class RecentCounter { queue<int> q; public: RecentCounter() {} int ping(int t) { q.push(t); while (q.front() < t - 3000) { q.pop(); } return q.size(); } };

Java

class RecentCounter { Queue<Integer> queue; public RecentCounter() { queue = new ArrayDeque<Integer>(); } public int ping(int t) { queue.offer(t); while (queue.peek() < t - 3000) { queue.poll(); } return queue.size(); } }

复杂度分析

时间复杂度:均摊 O(1),每个元素至多入队出队各一次。

空间复杂度:O(L),其中 L 为队列的最大元素个数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 4:54:04

双增量编码器电机编码方法解析:游标刻线原理与3步实现绝对位置

双增量编码器绝对位置测量技术&#xff1a;游标刻线算法与STM32实现指南在工业自动化与机器人控制领域&#xff0c;精确的位置感知是实现高精度运动控制的基础。传统单编码器方案在断电后需要重新校准&#xff0c;而高精度绝对编码器又面临成本高昂的问题。本文将深入解析一种基…

作者头像 李华
网站建设 2026/7/10 4:53:50

STM32L442KC与AD5593R的嵌入式数据采集系统设计

1. AD5593R与STM32L442KC的硬件组合解析AD5593R是Analog Devices推出的一款高度集成的12位数据转换器&#xff0c;它在一个芯片上同时集成了8通道ADC和8通道DAC功能。这款芯片通过I2C接口与主控器通信&#xff0c;工作电压范围为2.7V至5.5V&#xff0c;非常适合嵌入式系统应用。…

作者头像 李华
网站建设 2026/7/10 4:48:35

TLA2518与PIC18LF27K42构建高精度多通道ADC系统

1. 项目背景与核心需求在工业自动化、医疗设备和消费电子等领域&#xff0c;模拟信号到数字信号的可靠转换一直是系统设计的关键环节。TLA2518作为德州仪器推出的12位精度、1MSPS采样率的8通道ADC芯片&#xff0c;配合PIC18LF27K42这款低功耗高性能微控制器&#xff0c;能够构建…

作者头像 李华
网站建设 2026/7/10 4:42:25

OpenGL 状态机与对象模型解析:3个关键API调用与性能影响实测

OpenGL状态机与对象模型解析&#xff1a;3个关键API调用与性能影响实测1. OpenGL状态机机制深度剖析OpenGL本质上是一个庞大的状态集合体&#xff0c;其设计哲学围绕"状态机"概念展开。理解这一点对性能优化至关重要——每次状态变更都会触发驱动层复杂的验证与同步操…

作者头像 李华
网站建设 2026/7/10 4:42:00

STC89C52 火灾检测系统:MQ-2/DS18B20/火焰传感器 3路信号融合与阈值调节实战

STC89C52火灾检测系统&#xff1a;三传感器融合算法与动态阈值优化实战在智能安防领域&#xff0c;多传感器数据融合技术正成为环境监测系统的核心解决方案。本文将深入剖析基于STC89C52单片机的火灾检测系统设计&#xff0c;重点解读MQ-2烟雾传感器、DS18B20温度传感器与火焰传…

作者头像 李华