LeetCode146 LRU快取機制

2021-10-03 19:14:22 字數 1434 閱讀 2799

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

主要用到三種資料結構,unordered_map、list、pair。將鍵與值用pair關聯起來,放入list中。unoedered_map裡面放的是鍵值和鍵值對應的pair在list中的迭代器。查詢元素的時候,如果沒有就返回-1,如果找到了,將list中對應的節點在原來的位置刪除之後新增到頭節點,然後返回查到的value的值。放入元素的時候,如果沒有找到,就新增乙個pair放入list的頭節點,並且加入到unordered_map中。如果找到了,那麼就修改unordered_map中的第二個元素的值,並且把對應鍊錶的節點放到頭部去。

class lrucache 

int get(int key)

}void put(int key, int value)

ls_.push_front(make_pair(key, value));

hash_[key] = ls_.begin();

}private:

int capacity_;

list> ls_;

unordered_map>::iterator> hash_;

};/**

* 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 如果金鑰不存在,則寫入其資料值。當快取容量...