這是悅樂書的第357次更新,第384篇原創
java
今天介紹的是LeetCode
算法題中Easy
級別的第219
題(順位題號是933
)。寫一個類RecentCounter
來計算最近的請求。算法
它只有一個方法:ping(int t)
,其中t表明一些時間(以毫秒爲單位)。數組
返回從3000毫秒前到如今爲止的ping數。數據結構
在[t-3000,t]
中任什麼時候間ping
都將計數,包括當前ping
。測試
每次調用ping
都使用比以前嚴格更大的t
值。例如:code
輸入:inputs = [「RecentCounter」,「ping」,「ping」,「ping」,「ping」], inputs = [[],[1],[100],[3001],[3002]] 輸出:[null,1,2,3,3]
注意:隊列
每一個測試用例最多能夠有10000次ping操做。rem
每一個測試用例都會嚴格增長t的值來調用ping。get
每次調用ping,t的取值範圍爲1 <= t <= 10^9。
input
題目的意思是每次調用RecentCounter
類的ping
方法時,計算[t-3000,t]
範圍內的數有多少,而t
每次都會增長,也就是說,由屢次調用ping
方法組成的t數組,是一個遞增數組,而咱們只須要每次拿到新的t時,計算[t-3000,t]
內的t有多少個。
使用List存儲每次調用ping
方法時傳入的t
,而後計數[t-3000,t]
內的元素個數。
class RecentCounter { List<Integer> list; public RecentCounter() { list = new ArrayList<Integer>(); } public int ping(int t) { list.add(t); int min = t-3000, count = 0; for (Integer num : list) { if (num >= min && num <= t) { count++; } } return count; } } /** * Your RecentCounter object will be instantiated and called as such: * RecentCounter obj = new RecentCounter(); * int param_1 = obj.ping(t); */
一樣的思路,可是要比上面的解法更加高效。
由於t是一個遞增的數,而且每次計算時,新的t是確定包含在其中的,因此咱們只須要判斷[t-3000,t]
中的前半部分t-3000
便可,從List
的第一位元素開始,若是小於t-3000
就移除,直到List
中的第一位元素符合[t-3000,t]
範圍,最會返回List
的size
便可。
class RecentCounter { List<Integer> list; public RecentCounter() { list = new ArrayList<Integer>(); } public int ping(int t) { list.add(t); int i = 0, n = list.size(); while (i < n && list.get(i) < t-3000) { list.remove(list.get(i)); } return list.size(); } } /** * Your RecentCounter object will be instantiated and called as such: * RecentCounter obj = new RecentCounter(); * int param_1 = obj.ping(t); */
從第二種解法中,能夠看出t數組是存在一種前後順序,由於咱們永遠只須要處理前面先進來的數據,而這一特性,能夠聯想到隊列,由於他們都有先進先出的特性。
每次調用ping
方法時,將t入隊列,而後判斷隊列頂部的元素是否小於t-3000
,若是小於,就將隊列頂部的元素移除,直到隊列頂部元素大於等於t-3000
,最後返回隊列的size
便可。
class RecentCounter { Queue<Integer> queue; public RecentCounter() { queue = new LinkedList<Integer>(); } public int ping(int t) { if (queue.isEmpty()) { queue.offer(t); return 1; } else { int min = t-3000; while (!queue.isEmpty() && queue.peek() < min) { queue.poll(); } queue.offer(t); } return queue.size(); } } /** * Your RecentCounter object will be instantiated and called as such: * RecentCounter obj = new RecentCounter(); * int param_1 = obj.ping(t); */
算法專題目前已連續日更超過六個月,算法題文章225+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!