933. 最近的請求次數
阿新 • • 發佈:2018-11-09
寫一個 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]
提示:
- 每個測試用例最多呼叫
10000
次ping
。 - 每個測試用例會使用嚴格遞增的
t
值來呼叫ping
。 - 每次呼叫
ping
都有1 <= t <= 10^9
-
class RecentCounter { public RecentCounter() { } int[] rds = new int[10000]; int cnt=-1; int i=0; public int ping(int t) { cnt++; rds[cnt]=t; //不用每次都遍歷,下次的i就是前面最後的i for( ;i<=cnt;++i){ if(rds[i]>=t-3000) break; } return cnt-i+1; } }
思路:直接用陣列來儲存t,因為陣列是嚴格遞增的所以判斷if(rds[i]>=t-3000) break; 就是最近的索引,因為t是嚴格遞增的所以可以利用之前的已經查詢的結果(用一個全域性變數i快取,下次迴圈還是從i開始遍歷),這樣可以節約很多時間。儘量別用自帶的佇列資料結構,開銷太大。目前beat 100% 。