可以购买网站空间的网站,仿别人的网站违法嘛,百度医生在线问诊,加工网线请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类#xff1a;
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中#xff0c;则返回关键字的值#xff0c;否则返回 -…请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中则返回关键字的值否则返回 -1 。void put(int key, int value) 如果关键字 key 已经存在则变更其数据值 value 如果不存在则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity 则应该 逐出 最久未使用的关键字。
函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。 示例
输入
[LRUCache, put, put, get, put, get, put, get, get, get]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -1, 3, 4]解释
LRUCache lRUCache new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {11}
lRUCache.put(2, 2); // 缓存是 {11, 22}
lRUCache.get(1); // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废缓存是 {11, 33}
lRUCache.get(2); // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废缓存是 {44, 33}
lRUCache.get(1); // 返回 -1 (未找到)
lRUCache.get(3); // 返回 3
lRUCache.get(4); // 返回 4
思路 双向链表维护头尾节点用哈希表键值对寻找节点
代码
class lrulist
{public:int val;int key;lrulist* next;lrulist* last;lrulist(int value, int k) : val(value), key(k), next(nullptr), last(nullptr){}
};
class LRUCache {
public:unordered_mapint, lrulist* hashmap;lrulist* back;lrulist* front;int size;int cap;void push_front(int value, int key){lrulist* newnode new lrulist(value, key);hashmap[key] newnode;if(front){newnode-next front;front-last newnode;}elseback newnode;front newnode;size;}void move(lrulist* node){if(node front)return;if(back node){back back-last;if(back)back-next nullptr; }else{node-last-next node-next;node-next-last node-last; }node-next front;if(front)front-last node;front node;}void del_node(lrulist* node){if(front node){front front-next;if(front)front-last nullptr;}else if(back node){back back-last;if(back)back-next nullptr;}hashmap.erase(node-key);--size;delete node; }LRUCache(int capacity) : size(0), cap(capacity), front(nullptr), back(nullptr){}int get(int key) {if(hashmap.find(key) ! hashmap.end()){move(hashmap[key]);return hashmap[key]-val;}elsereturn -1;}void put(int key, int value) {if(hashmap.find(key) hashmap.end()){if(size cap)del_node(back);push_front(value, key);}else{hashmap[key]-val value;move(hashmap[key]);}}
};