Python 为什么队列是查找最近呼叫数的最佳方法?[Leetcode问题]
我刚刚解决了Leetcode上的“最近通话次数”问题。我读到它想让我返回ping的数量,但不知道如何去做 详情如下: 编写一个类RecentCounter来计算最近的请求 它只有一个方法:ping(intt),其中t表示以毫秒为单位的时间 返回从3000毫秒前到现在进行的ping数 时间在[t-3000,t]内的任何ping都将计算在内,包括当前ping 可以保证对ping的每次调用都使用比以前严格更大的t值 我了解到,你必须立即知道你需要使用队列。我不知道,只是想知道是否有人可以解释为什么需要使用队列来解决这个问题。这里有一个解决方案Python 为什么队列是查找最近呼叫数的最佳方法?[Leetcode问题],python,python-3.x,queue,python-3.6,Python,Python 3.x,Queue,Python 3.6,我刚刚解决了Leetcode上的“最近通话次数”问题。我读到它想让我返回ping的数量,但不知道如何去做 详情如下: 编写一个类RecentCounter来计算最近的请求 它只有一个方法:ping(intt),其中t表示以毫秒为单位的时间 返回从3000毫秒前到现在进行的ping数 时间在[t-3000,t]内的任何ping都将计算在内,包括当前ping 可以保证对ping的每次调用都使用比以前严格更大的t值 我了解到,你必须立即知道你需要使用队列。我不知道,只是想知道是否有人可以解释为什么需要
import collections
class recentCounter:
def __init__(self):
self.p = collections.deque()
def ping(self, t: int):
self.p.append(t)
while self.p[0] < t - 3000:
self.p.popleft()
return len(self.p)
导入集合
类最近计数器:
定义初始化(自):
self.p=collections.deque()
def ping(自,t:int):
self.p.append(t)
当self.p[0]
队列只是数组的一个子类,其中新值附加到底部,旧值从顶部开始添加到顶部
你不一定需要这个来解决你的问题;您可以将每个新值附加到带有时间戳的数组中,然后在数组上迭代以仅返回过去三秒的值。然而,队列要优雅得多。此解决方案只保留数组必须保留的时间,然后不需要额外的工作就可以产生所需的结果。队列只是数组的一个子类,其中新值将附加到底部,旧值将从顶部弹出
你不一定需要这个来解决你的问题;您可以将每个新值附加到带有时间戳的数组中,然后在数组上迭代以仅返回过去三秒的值。然而,队列要优雅得多。此解决方案只保留数组必须保留的时间,然后不需要额外的工作即可产生所需的结果。队列不是数组
的子类(假设您指的是数组.array
或列表
,但它不是这两个类的子类)。此外,它不仅更优雅,而且比这里的列表更有效,因为.popleft
是带有deque
对象的恒定时间,而不是带有list
对象的等价操作的线性时间。你是对的,子类不精确;我指的是队列的概念,“子类型”会更好。重要的是要指出节省时间以及!谢谢大家。因此,它更为优化,但您不必总是使用队列?有一些解决方案不需要队列,但对于这个问题,您绝对应该使用队列。队列不是array
的子类(假设您指的是array.array
或list
,但它不是这两者的子类)。此外,它不仅更优雅,而且比这里的列表更有效,因为.popleft
是带有deque
对象的恒定时间,而不是带有list
对象的等价操作的线性时间。你是对的,子类不精确;我指的是队列的概念,“子类型”会更好。重要的是要指出节省时间以及!谢谢大家。这样做的好处是它更为优化,但您不必总是使用队列?有些解决方案不需要队列,但对于这个问题,您绝对应该使用队列。您不必使用deque
,但deque
具有恒定的时间popleft
操作,哪一个比等价的my_list.pop(0)
更有效?它是列表
对象上的线性时间。您不必使用deque
,但是deque
具有恒定的时间popleft
操作,这比等价的my_list.pop(0)更有效
这将是列表
对象上的线性时间