Leetcode 933:最近的请求次数(最详细的解法!!!)

版权声明:本文为博主原创文章,未经博主允许不得转载。有事联系:[email protected] https://blog.csdn.net/qq_17550379/article/details/84226962

写一个 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]

提示:

  1. 每个测试用例最多调用 10000ping
  2. 每个测试用例会使用严格递增的 t 值来调用 ping
  3. 每次调用 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

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

猜你喜欢

转载自blog.csdn.net/qq_17550379/article/details/84226962