LeetCode每日一題 佇列的最大值

2021-10-03 15:22:01 字數 1614 閱讀 4259

請定義乙個佇列並實現函式 max_value 得到佇列裡的最大值,要求函式max_value、push_back 和 pop_front 的均攤時間複雜度都是o(1)。

若隊列為空,pop_front 和 max_value 需要返回 -1

示例 1:

輸入:

[「maxqueue」,「push_back」,「push_back」,「max_value」,「pop_front」,「max_value」]

[,[1],[2],,,]

輸出: [null,null,null,2,1,2]

示例 2:

輸入:

[「maxqueue」,「pop_front」,「max_value」]

[,,]

輸出: [null,-1,-1]

限制:

1 <= push_back,pop_front,max_value的總算子 <= 10000

1 <= value <= 10^5

從佇列尾部插入元素時,提前取出佇列中所有比這個元素小的元素,使得佇列中只保留對結果有影響的數字,即比將要插入的值大的值。這樣的方法等價於要求維持佇列單調遞減,即要保證每個元素的前面都沒有比它小的元素。

需要從佇列尾部取出元素,因此需要使用雙端佇列deque,也需要乙個輔助queue佇列來記錄所有被插入的值,以確定 pop_front 函式的返回值。保證了佇列單調遞減後,求最大值時只需要直接取雙端佇列中的第一項即可。

刪除操作於求最大值操作顯然只需要 o(1) 的時間。而插入操作雖然看起來有迴圈,做乙個插入操作時最多可能會有 n 次出隊操作。但要注意,由於每個數字只會出隊一次,因此對於所有的 n 個數字的插入過程,對應的所有出隊操作也不會大於 n 次。因此將出隊的時間均攤到每個插入操作上,時間複雜度為 o(1)。

空間複雜度:o(n)。

class

maxqueue

intmax_value()

void

push_back

(int value)

deque_.

push_back

(value);}

intpop_front()

int t = queue_.

front()

; queue_.

pop();

if(t == deque_.

front()

) deque_.

pop_front()

;return t;}}

;/**

* your maxqueue object will be instantiated and called as such:

* maxqueue* obj = new maxqueue();

* int param_1 = obj->max_value();

* obj->push_back(value);

* int param_3 = obj->pop_front();

*/

每日一題 LeetCode

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...

LeetCode每日一題(題1028)

最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...

LeetCode每日一題(題139)

題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...