LeetCode.933-最近通話次數(Number of Recent Calls)

這是悅樂書的第357次更新,第384篇原創

java

01 看題和準備

今天介紹的是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

02 第一種解法

題目的意思是每次調用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);
 */


03 第二種解法

一樣的思路,可是要比上面的解法更加高效。

由於t是一個遞增的數,而且每次計算時,新的t是確定包含在其中的,因此咱們只須要判斷[t-3000,t]中的前半部分t-3000便可,從List的第一位元素開始,若是小於t-3000就移除,直到List中的第一位元素符合[t-3000,t]範圍,最會返回Listsize便可。

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);
 */


04 第三種解法

從第二種解法中,能夠看出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);
 */


05 小結

算法專題目前已連續日更超過六個月,算法題文章225+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

相關文章
相關標籤/搜索