題目:
寫一個 RecentCounter 類來計算特定時間範圍内最近的請求。
請你實作 RecentCounter 類:
輸入:
["RecentCounter", "ping", "ping", "ping", "ping"]
[[], [1], [100], [3001], [3002]]
輸出:
[null, 1, 2, 3, 3]
解釋:
RecentCounter recentCounter = new RecentCounter();
recentCounter.ping(1); // requests = [1],範圍是 [-2999,1],傳回 1
recentCounter.ping(100); // requests = [1, 100],範圍是 [-2900,100],傳回 2
recentCounter.ping(3001); // requests = [1, 100, 3001],範圍是 [1,3001],傳回 3
recentCounter.ping(3002); // requests = [1, 100, 3001, 3002],範圍是 [2,3002],傳回 3
解決思路
題目意思就是往隊列裡存放元素啊,每次ping就存一個數,然後存的時候看一下之前的數是否在t-3000之外了,是就删除;
比如題目給的例子:
輸入:
["RecentCounter", "ping", "ping", "ping", "ping"]
[[], [1], [100], [3001], [3002]]
輸出:
[null, 1, 2, 3, 3]
就是第一次存個1,第二次存個100……
然後每次存的時候,看看之前存的元素,有多少個在這次存的 t 到t-3000之間;
存1的時候,1在[-2999,1]之間,就這一個數,是以說傳回數目1;
……
存3002的時候就删除1,因為1不在[2,3002]之間,而100,3001,3002都是在[2,3002]之間,就傳回數目3;
代碼實作
class RecentCounter {
Queue<Integer> q;
public RecentCounter() {
q = new LinkedList();
}
public int ping(int) {
q.add(t);
while (q.peek() < t - 3000) {
q.poll();
}
return
最後
- 時間複雜度:O(Q),其中 QQ 是 ping 的次數。
- 空間複雜度:O(W),其中 W = 3000 是隊列中最多存儲的 ping 的記錄數目。