欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > Leetcode146. LRU 缓存(HOT100)

Leetcode146. LRU 缓存(HOT100)

2024/11/30 12:26:15 来源:https://blog.csdn.net/kitesxian/article/details/143995282  浏览:    关键词:Leetcode146. LRU 缓存(HOT100)

链接

代码:

class LRUCache {
private:struct Node{int key,val;Node* left,*right;Node(int _key,int _val):key(_key),val(_val){}}*L,*R;unordered_map<int,Node*> hash;int n;public:void remove(struct Node* p){p->left->right = p->right;p->right->left = p->left;//不要delete p;因为有可能我们只是更新一个Node,即:将它从list中remove,然后再insert进来,真正删掉一个节点是在超过capacity时}void insert(struct Node* p){p->right = L->right;p->left = L;L->right = p;p->right->left = p;}LRUCache(int capacity) {n = capacity;//capacity是一个形参,函数结束就销毁了,所以我们用一个n来记录L = new Node(-1,-1),R = new Node(-1,-1);//定义左右两个节点,用来管理双向链表。L->right = R,R->left = L;}int get(int key) {if(hash.count(key)==0)return -1;auto p = hash[key];//p是一个迭代器remove(p);insert(p);return p->val;}void put(int key, int value) {if(hash.count(key)){auto p = hash[key];p->val = value;remove(p);insert(p);}else{if(n==hash.size()){auto p = R->left;//p是一个Noderemove(p);hash.erase(p->key);//erase需要参数key,我们通过Node找到其中的keydelete p;}auto q = new Node(key,value);hash[key] = q;//not hash[key] = value;//hash的value是一个Nodeinsert(q);//在双向链表中插入时,别忘了在hash中也插入}}
};

图解:

L和R是两个指向虚拟左右节点的指针,它们中间管理所有已经在hash表中的key value值以及相邻节点的地址。 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com