LeetCode 146 LRU快取機制

2021-09-18 04:34:04 字數 1699 閱讀 9971

運用你所掌握的資料結構,設計和實現乙個  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

讀完grandyang大神的**後才搞清楚咋回事,一開始我都不知道題目讓幹啥。。這道題就是設計乙個鍊錶,煉表裡的元素是pair,用來儲存成對出現的鍵和值。get函式傳入key返回value,put函式傳入成對的key和value新增到鍊錶中。先說get函式,為了能在o(1)時間查詢到鍵對應的值,所以我們建立乙個雜湊map,將「鍵」對映到鍊錶中儲存該「鍵-值對」的迭代器上,這樣我們就可以在o(1)時間找到鍊錶中的位置。如果在雜湊map中沒找到那麼返回-1,找到的話將找出的迭代器在鍊錶中轉移到鍊錶的頭部,這步操作用splice函式完成,然後返回找到的值。接下來是put函式,傳入成對的key和value,用key在雜湊map中查詢,如果找到了,那麼我們需要把鍊錶中該key對應的value設定為傳入的value,然後把該鍵-值對轉移到鍊錶的頭部。否則在雜湊map中沒有找到的話,我們就需要在鍊錶中新增新的鍵-值對,並在雜湊map中也建立此對映。然後我們判斷此時鍊錶的大小是否超出了容量cap,如果超出了,那麼我們需要把鍊錶尾部的節點刪除,並且將該鍵-值對從雜湊map中也刪除。

class lrucache 

int get(int key)

void put(int key, int value)

else

} }

private:

int cap;

list> l;

unordered_map>::iterator> umap;

};/**

* 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快取機制

使用hash map和雙向鍊錶來做這題 class lrucache int cachesize int currentsize unordered mapnodes cachenode head cachenode last lrucache int capacity 獲取某個節點如果存在返回並且...