1. 程式人生 > >Leetcode 933:最近的請求次數(最詳細的解法!!!)

Leetcode 933:最近的請求次數(最詳細的解法!!!)

寫一個 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. 每個測試用例最多呼叫 10000
    ping
  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

如有問題,希望大家指出!!!