Leetcode 933:最近的請求次數(最詳細的解法!!!)
阿新 • • 發佈:2018-12-22
寫一個 RecentCounter
類來計算最近的請求。
它只有一個方法:ping(int t)
,其中 t
代表以毫秒為單位的某個時間。
返回從 3000 毫秒前到現在的 ping
數。
任何處於 [t - 3000, t]
時間範圍之內的 ping
都將會被計算在內,包括當前(指 t
時刻)的 ping
。
保證每次對 ping
的呼叫都使用比之前更大的 t
值。
示例:
輸入:inputs = ["RecentCounter","ping","ping","ping","ping"], inputs = [[],[1],[100],[3001],[3002]]
輸出:[null,1,2,3,3]
提示:
- 每個測試用例最多呼叫
10000
ping
。 - 每個測試用例會使用嚴格遞增的
t
值來呼叫ping
。 - 每次呼叫
ping
都有1 <= t <= 10^9
。
解題思路
這個問題非常簡單,最簡單的思路就是使用佇列,佇列中維護當前時間[t-3000,t]
這個區間的全部元素,最後返回的結果就是這個佇列的長度。
class RecentCounter:
def __init__(self):
self.pings = list()
def ping(self, t):
"""
:type t: int
:rtype: int
"""
self.pings.append(t)
while self.pings[0] < t - 3000:
self.pings.pop(0)
return len(self.pings)
也可以使用deque
實現。
from collections import deque
class RecentCounter:
def __init__(self):
self.pings = deque()
def ping(self, t):
"""
:type t: int
:rtype: int
"""
self.pings.append(t)
while self.pings[0] < t - 3000:
self.pings.popleft()
return len(self.pings)
我們也可以採用二分搜尋發優化搜尋過程。
class RecentCounter:
def __init__(self):
self.pings = list()
def ping(self, t):
"""
:type t: int
:rtype: int
"""
self.pings.append(t)
l, r = 0, len(self.pings)
if t > 3000:
while l < r:
mid = (l + r)//2
if self.pings[mid] < t - 3000:
l = mid + 1
else:
r = mid
return len(self.pings) - l
如有問題,希望大家指出!!!