#include <unordered_map>
#include <list>
using namespace std;
class LRUCache {
private:
int capacity;
list<pair<int, int>> cacheList; // 双向链表,存储 (key, value)
unordered_map<int, list<pair<int, int>>::iterator> cacheMap; // 哈希表,key -> 迭代器
public:
LRUCache(int _capacity) : capacity(_capacity) {}
int get(int key) {
if (cacheMap.find(key) == cacheMap.end()) {
return -1;
}
// 将该节点移动到链表头部(最近使用)
auto it = cacheMap[key];
int value = it->second;
cacheList.erase(it);
cacheList.push_front({key, value});
cacheMap[key] = cacheList.begin();
return value;
}
void put(int key, int value) {
if (cacheMap.find(key) != cacheMap.end()) {
// 如果 key 存在,删除旧节点
cacheList.erase(cacheMap[key]);
} else if (cacheList.size() >= capacity) {
// 如果容量已满,删除最久未使用的节点(链表尾部)
auto last = cacheList.back();
cacheMap.erase(last.first);
cacheList.pop_back();
}
// 插入新节点到链表头部,并更新哈希表
cacheList.push_front({key, value});
cacheMap[key] = cacheList.begin();
}
};
力扣146. LRU 缓存
最新推荐文章于 2025-06-11 18:07:26 发布