895. Maximum Frequency Stack
題目網址:https://leetcode.cn/problems/maximum-frequency-stack/
題意:設計一個類似 stack 的資料結構, 將元素 push 到 stack 中, 並從 stack 中 pop 出頻率最高的元素。
請實現
FreqStack
class:
FreqStack()
:建立一個空的 stackvoid push(int val)
:將整數val
push 到 stack 中int pop()
:刪除並返回 stack 中頻率最高的元素
- 若頻率最高的元素不只一個, 則刪除並返回最接近 stack top 的元素
Solution 1:
想法:利用 Bucket, 使用多個 stack, 來模擬
FreqStack
。每 push 一個元素就要 push 到當前對應頻率的 stack 中。同一頻率中, 越晚加入的元素就會越接近其對應頻率的 stack 之 tope.g. push
[5, 7, 5, 7, 4, 5]
, 最後可得到下圖中右下角的表格, 然後依序從 freq 高的開始 pop ➔ pop 的順序由下往上、由右至左為[5, 7, 5, 4, 7 ,5]
class FreqStack { |
令 n
為 push 的次數
- time:
push()
:$O(1)$, push 元素到 stack 中pop()
:$O(1)$, 從 stack 中 pop 元素
- space:$O(n)$ ➔ stacks 中的元素不超過
n
個
Solution 2:
想法:利用 Heap, 概念同 Solution 1, 本題的困難點在於:
- 每次 pop 時, 必須知道頻率最高的元素是哪個
- 若頻率最高的元素不只一個, 還得知道最晚 push 進來的元素是哪個
因此, 我們須做到以下幾點:
- 用 max heap
q
來維護當前 stack 中頻率最高的元素- 用
timestamp
紀錄每個元素 push 進來的順序(越晚 push 進來的元素, 其timestamp
越大)- 若
q
中有相同頻率的元素, 得用timestamp
來判斷要優先取哪個。因此q
中應保存{freq, timestamp, val}
, 這樣當freq
相同時, top 就會優先取timestamp
高的元素
class FreqStack { |
令 n
為 push 的次數
- time:
push()
:$O(log(n))$, 因為元素 push 到 heap 中, 需調整 heappop()
:$O(log(n))$, 因為元素 pop 後, 需調整 heap
- space:$O(n)$ ➔
q
中的元素不超過n
個
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論