146. LRU Cache
題目網址:https://leetcode.cn/problems/lru-cache/
題意:設計並實現一個滿足 LRU(Least Recently Used)的資料結構。
實現
LRUCacheclass:
LRUCache(int capacity):以capacity初始化 LRU cache 的大小。int get(int key):若key存在於 cache 中, 則返回其對應的val, 否則返回1。void put(int key, int value):
- 若
key已經存在, 則變更其value- 若不存在, 則將該組
key-valueinsert 到 cache 中- 若 insert 操作導致 pair 數量超過
capacity, 則移除最久未使用的key-valuepair注意:
get()和put()必須是 $O(1)$ time

Solution:
想法:利用 hash table + list, 其中
cache用來存放所有的key, 用來記錄哪個key最近被使用、最久沒被使用。用 list 而非 forward_list 的原因是:「當get()訪問的是處於中間位置的節點時, 可以直接獲取其前一個節點和後一個節點, 從而省去了遍歷整個 linked list的時間」。若用 forward_list, 要獲取前一個節點和後一個節點必須從 linked list 的 head 開始遍歷
cache.begin(): 最久未用的 key--cache.end(): 最近使用的 key而
key2val和key2iter分別存放key所對應到的val和iterator
get(key):
- 若
key已在cache中, 則將其放到cache尾部- 若
key不在cache中, 則返回1put(key, value):
- 若
key已在cache中, 則更新其對應的 val- 若
key不在cache中, 則要新增該 key。若capacity已滿, 則要移除cache.begin()
class LRUCache { |
- time:$O(1)$
- space:$O(capacity)$ ➔
cache,key2val,key2iter的元素個數不超過capacity
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論