关于队列的算法

队列是什么

如同我们在做核酸一样,排队去做。每当做完一个,则从队伍中剔除,有其他没做的人,则依次从队伍尾端加入队列。实际算法中的队列也是如此,先入先出。

时间复杂度

访问:O(N)
搜索:O(N)
插入:O(1)
删除:O(1)

题目

  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)
posted @ 2022-08-12 00:12  影梦无痕  阅读(70)  评论(0)    收藏  举报