1.資料結構
為了滿足o(1)的複雜度,需要雜湊表。另外還需要雙向鍊錶存放(key,value).
雜湊表中存放(key, key在鍊錶中的位置)。
2.演算法
2.1 get操作
if key不存在:
直接返回-1
else
在原煉表中刪除(key,value)
將(key,value)重新放回鍊錶的頭部
更新雜湊表
返回value
2.2 put操作if key存在:
在原煉表中刪除(key, value)
將(key,value)重新放回鍊錶的頭部
更新雜湊表
else
if 鍊錶長度達到上限:
獲取鍊錶尾部的key
在雜湊表中刪除key
刪除鍊錶尾部元素
將新的(key,value)插入鍊錶頭部
將(key, key在鍊錶中的位置)放入雜湊表
else
將新的(key,value)插入鍊錶頭部
將(key, key在鍊錶中的位置)放入雜湊表
3.實現
自己實現雙向鍊錶,map中存放(key,node)
class
lrucache
;void
addnode
(dlinkednode* node)
intremovenode
(dlinkednode* node)
void
movetohead
(dlinkednode* node)
private
: unordered_map<
int,dlinkednode*
> cache;
dlinkednode* head;
dlinkednode* tail;
int size;
int capacity;
public
:lrucache
(int capacity)
intget
(int key)
movetohead
(it-
>second)
;return it-
>second-
>value;
}void
put(
int key,
int value)
}else}}
;/**
* 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);
*/
或者使用庫中的list,map中存放(key,迭代器)
class
lrucache
intget
(int key)
void
put(
int key,
int value)
else
cachelist.
push_front
(make_pair
(key,value));
map.
insert
(make_pair
(key,cachelist.
begin()
));}
}};/**
* 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);
*/
學渣帶你刷Leetcode146 LRU快取機制
運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰已經存在,則變更其資料值...
leetcode146 LRU快取機制
運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰不存在,則寫入其資料值。...
LeetCode 146 LRU快取機制
運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料get和 寫入資料put。獲取資料get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料put key,value 如果金鑰不存在,則寫入其資料值。當快取容量...