关于队列的算法
队列是什么
如同我们在做核酸一样,排队去做。每当做完一个,则从队伍中剔除,有其他没做的人,则依次从队伍尾端加入队列。实际算法中的队列也是如此,先入先出。
时间复杂度
访问:O(N)
搜索:O(N)
插入:O(1)
删除:O(1)
题目
- 933最近的请求次数

解法一:
每次请求时间都添加进入队列中,然后都计算与之前的所有请求时间的差,如果大于3000,则记录需要删除的数据个数。然后根据删除个数去队列中提出对应个数的数据即可。因为从队列另一端剔除,所以剔除的数据为先入的数据,被保留的是后入的数据。此方法时间复杂度较高
class RecentCounter:
def __init__(self):
self.que = deque()
def ping(self, t: int) -> int:
removeNum = 0
self.que.append(t)
for i in self.que:
if t-i > 3000:
removeNum += 1
for j in range(removeNum):
self.que.popleft()
return len(self.que)
# Your RecentCounter object will be instantiated and called as such:
# obj = RecentCounter()
# param_1 = obj.ping(t)
解法二:
该方法巧妙应用self.q[0] < t - 3000数学计算,做到循环删除队列中的数据
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)
# Your RecentCounter object will be instantiated and called as such:
# obj = RecentCounter()
# param_1 = obj.ping(t)

浙公网安备 33010602011771号