这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战
非常感谢你阅读本文~
欢迎【👍点赞】【⭐收藏】【📝评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子 https://juejin.cn/user/2771185768884824/posts 博客原创~
剑指 Offer II 042. 最近请求次数:
写一个 RecentCounter
类来计算特定时间范围内最近的请求。
请实现 RecentCounter
类:
RecentCounter()
初始化计数器,请求数为 0 。int ping(int t)
在时间t
添加一个新请求,其中t
表示以毫秒为单位的某个时间,并返回过去3000
毫秒内发生的所有请求数(包括新请求)。确切地说,返回在[t-3000, t]
内发生的请求数。
保证 每次对 ping
的调用都使用比之前更大的 t
值。
样例 1
1 | scss复制代码输入: |
提示
- 1 <= t <= 109
- 保证每次对 ping 调用所使用的 t 值都 严格递增
- 至多调用 ping 方法 104 次
分析
- 二当家的觉得这道算法题相对来说还是自由度比较高的。
- 由于有提示中第二条的规定,每次 ping 调用所使用的t值都严格递增,所以可以使用队列,如果已经和最新的t相差超过3000,就可以清除了,按顺序出队列即可,队列中元素最多也只有3000个,也就是每次 ping 最差就是不超过3000次出队列,而队列留下的值恰好就是 ping 方法返回值。
- 由于有提示中第三条的规定,ping 的最高调用次数已经知道,如果使用可随机访问的数据结构,还可以使用二分查找,时间复杂度上会比按顺序出队列好一些,但是如果 ping 的次数是不一定的,还是用队列好。
题解
java
没有使用自带的二分查找,因为查不到是负数,不是我们想要的值。
1 | java复制代码class RecentCounter { |
c
1 | c复制代码typedef struct { |
c++
1 | cpp复制代码class RecentCounter { |
python
python这次是最简洁的了,主要就是有可以直接用的二分查找。
1 | python复制代码class RecentCounter: |
go
1 | go复制代码type RecentCounter struct { |
rust
1 | rust复制代码struct RecentCounter { |
原题传送门:https://leetcode-cn.com/problems/H8086Q/
本文转载自: 掘金