Anusha Murali

Logo

Please see github.com/anusha-murali for all of my repositories.

View GitHub Profile

Number of Recent Calls

This is a nice problem from LeetCode (Problem #933).

Problem: You have a RecentCounter class which counts the number of recent requests within a certain time frame.

Implement the RecentCounter class:

It is guaranteed that every call to ping uses a strictly larger value of $t$ than the previous call.

Example 1

Input
["RecentCounter", "ping", "ping", "ping", "ping"]
[[], [1], [100], [3001], [3002]]
Output
[null, 1, 2, 3, 3]

Explanation
RecentCounter recentCounter = new RecentCounter();
recentCounter.ping(1);     // requests = [1], range is [-2999,1], return 1
recentCounter.ping(100);   // requests = [1, 100], range is [-2900,100], return 2
recentCounter.ping(3001);  // requests = [1, 100, 3001], range is [1,3001], return 3
recentCounter.ping(3002);  // requests = [1, 100, 3001, 3002], range is [2,3002], return 3

Solution

We are interested in counting the number of requests in the inclusive range [$t - 3000, t$]. Therefore, we maintain the requests in a queue and we repeatedly pop off the first element if its value is $< t - 3000$, where $t$ is the current time. The remaining elements in the queue constitute the requests that happened in the inclusive range [$t - 3000, t$].

class RecentCounter:
    def __init__(self):
        self.counters= deque() 

    def ping(self, t: int) -> int:
        self.counters.append(t) 
        while self.counters and self.counters[0] < t - 3000:  
            self.counters.popleft() 
        return len(self.counters) 
        
# Your RecentCounter object will be instantiated and called as such:
# obj = RecentCounter()
# param_1 = obj.ping(t)

Runtime:

The time complexity is $O(1)$. This is because a ping() operation involves just an append() to the queue and a popleft(), both of which are constant operations.

The space complexity is also $O(1)$ as our queue will never exceed 3000ms due to the problem definition.

Back to Queues Problems


anusha-murali.github.io