【问题标题】:Why is the queue the best approach for finding the number of recent calls? [Leetcode problem]为什么队列是查找最近呼叫数量的最佳方法? 【Leetcode问题】
【发布时间】:2019-05-20 18:38:30
【问题描述】:

我刚刚在 Leetcode 上解决了“最近通话次数”问题。我读到它希望我返回 ping 的数量,但不知道如何去做。

说明在这里:

编写一个RecentCounter 类来统计最近的请求。

它只有一种方法:ping(int t),其中 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)

【问题讨论】:

  • 你没有必须使用deque,但是deque有一个恒定时间popleft操作,这比等效的@987654325更有效@ 这将是 list 对象上的线性时间

标签: python python-3.x queue python-3.6


【解决方案1】:

队列只是数组的一个子类,其中新值是appended 到底部,旧值是poplefted 从顶部。

您不一定需要它来解决您的问题;您可以append 带有时间戳的数组的每个新值,然后遍历数组以仅返回最后三秒的值。但是,队列要优雅得多。此解决方案只保留您的数组,只要它必须是,然后不需要额外的工作来产生所需的结果。

【讨论】:

  • 队列不是array 的子类(假设您的意思是array.arraylist,但它不是两者的子类)。此外,它不仅更优雅,而且比此处的列表更有效,因为.popleftdeque 对象的恒定时间与 list 对象上的等效操作的线性时间
  • 你说得对,子类不精确;我的意思是队列的概念,“子类型”会更好。重要的是要指出节省时间!
  • 谢谢大家。所以要点是它更优化,但您不必总是使用队列?
  • 有些解决方案不需要队列,但是对于这个问题,你绝对应该使用一个。
猜你喜欢
  • 2015-01-18
  • 2022-06-10
  • 2013-12-27
  • 2015-07-31
  • 2020-01-27
  • 2016-01-08
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
相关资源
最近更新 更多