LRU LeetCode
一、題目描述
運(yùn)用你所掌握的數(shù)據(jù)結(jié)構(gòu),設(shè)計(jì)和實(shí)現(xiàn)一個(gè)? LRU (最近最少使用) 緩存機(jī)制 。
實(shí)現(xiàn) LRUCache 類:
LRUCache(int capacity) 以正整數(shù)作為容量 capacity 初始化 LRU 緩存
int get(int key) 如果關(guān)鍵字 key 存在于緩存中,則返回關(guān)鍵字的值,否則返回 -1 。
void put(int key, int value) 如果關(guān)鍵字已經(jīng)存在,則變更其數(shù)據(jù)值;如果關(guān)鍵字不存在,則插入該組「關(guān)鍵字-值」。當(dāng)緩存容量達(dá)到上限時(shí),它應(yīng)該在寫入新數(shù)據(jù)之前刪除最久未使用的數(shù)據(jù)值,從而為新的數(shù)據(jù)值留出空間。
進(jìn)階:你是否可以在 O(1) 時(shí)間復(fù)雜度內(nèi)完成這兩種操作?
提示:
1 <= capacity <= 3000
0 <= key <= 10000
0 <= value <= 105
最多調(diào)用 2 * 10^5 次 get 和 put
二、解題思路
實(shí)現(xiàn)本題的兩種操作,需要用到一個(gè)哈希表和一個(gè)雙向鏈表。在 Python 語言中,有一種結(jié)合了哈希表與雙向鏈表的數(shù)據(jù)結(jié)構(gòu) OrderedDict,只需要短短的幾行代碼就可以完成本題。
在 Java 語言中,同樣有類似的數(shù)據(jù)結(jié)構(gòu)
LinkedHashMap。
三、代碼
1、Python
2、Java
三、復(fù)雜度分析
時(shí)間復(fù)雜度:對(duì)于 put 和 get 都是 O(1)。
空間復(fù)雜度:O(capacity),因?yàn)楣1砗碗p向鏈表最多存儲(chǔ) capacity+1 個(gè)元素。
總結(jié)
以上是生活随笔為你收集整理的LRU LeetCode的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LRU算法及Java实现
- 下一篇: 商城计价中心 - 从容应对复杂场景价格计