運用你所掌握的資料結構,設計和實現乙個 lru (最近最少使用) 快取機制。它應該支援以下操作: 獲取資料 get 和 寫入資料 put 。
獲取資料 get(key) - 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總是正數),否則返回 -1。
寫入資料 put(key, value) - 如果金鑰不存在,則寫入其資料值。當快取容量達到上限時,它應該在寫入新資料之前刪除最近最少使用的資料值,從而為新的資料值留出空間。
高階:
你是否可以在 o(1) 時間複雜度內完成這兩種操作?
示例:
lrucache cache = new lrucache( 2 /* 快取容量 */ );
cache.put(1, 1);
cache.put(2, 2);
cache.get(1); // 返回 1
cache.put(3, 3); // 該操作會使得金鑰 2 作廢
cache.get(2); // 返回 -1 (未找到)
cache.put(4, 4); // 該操作會使得金鑰 1 作廢
cache.get(1); // 返回 -1 (未找到)
cache.get(3); // 返回 3
cache.get(4); // 返回 4
class
node
}class
doublelinkedlist
// 在鍊錶頭部新增節點 x
public
void
addfirst
(node x)
// 刪除鍊錶中的 x 節點(x 一定存在)
public
void
remove
(node x)
// 刪除鍊錶中最後乙個節點,並返回該節點
public node removelast()
public
intsize()
}class
lrucache
public
intget
(int key)
public
void
put(
int key,
int val)
else
if(capacity == cache.
size()
)
cache.
addfirst
(x);
// 更新 map 中對應的資料
map.
put(key, x);}
}/**
* your lrucache object will be instantiated and called as such:
* lrucache obj = new lrucache(capacity);
* int param_1 = obj.get(key);
* obj.put(key,value);
*/
時間複雜度:o(1
)o(1)
o(1)
;空間複雜度:o(n
)o(n)
o(n)
。直接使用linkedhashmap
。
class
lrucache
public
intget
(int key)
return-1
;}public
void
put(
int key,
int value)
else
if(map.
size()
== capacity)
map.
put(key, value);}
}
LRU快取機制 LeetCode
演算法思想 1 關鍵字存在 變更資料。2 關鍵字不存在 判斷快取容量是否達到上限 達到了上限,則應該刪除最久未使用的資料 未達上限,直接新增。get約束條件如下 如果關鍵字在快取,獲取該關鍵字的值,否則返回 1。此題目要求的資料結構需要滿足 查詢快 插入 刪除快且有順序之分的特點。於是結合兩個資料結...
leetcode題目 LRU快取機制
題目 運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制 實現 lrucache 類 lrucache int capacity 以正整數作為容量 capacity 初始化 lru 快取 int get int key 如果關鍵字 key 存在於快取中,則返回關鍵字的值,否則返回...
LeetCode 經典題 LRU快取
lru演算法應該對所有計算機 軟工的同學都不陌生了。那麼要如何實現lru演算法呢?lru演算法需要設計乙個資料結構,這個資料結構有兩個操作,乙個是get key 獲取key對應的value,如果key不存在則返回 1 put key,value 存入鍵值對 以上兩個操作的複雜度都應該為o 1 分析上...