LEETCODE,[leetcode]LRU Cache

 2023-09-20 阅读 27 评论 0

摘要:双链表+map 实现。所有数据存在链表里,map里存key到Node*的映射。注意当删除时除了要从链表尾部删除节点外,还要map.erase(it)。Node里也要有key,因为为了删除时方便找到it。 #include <map> using namespace std;class Node { public:int ke

双链表+map 实现。所有数据存在链表里,map里存key到Node*的映射。注意当删除时除了要从链表尾部删除节点外,还要map.erase(it)。Node里也要有key,因为为了删除时方便找到it。

#include <map>
using namespace std;class Node {
public:int key;int val;Node* prev;Node* next;Node(int _key, int _val) {key = _key;val = _val;prev = NULL;next = NULL;}
};class LRUCache{
public:LRUCache(int _capacity) {capacity = _capacity;head = new Node(-1, -1);tail = new Node(-1, -1);head->next = tail;tail->prev = head;mp.clear();size = 0;}int get(int key) {if (mp.find(key) == mp.end()) { // not foundreturn -1;}else { // foundNode* cur = mp.find(key)->second;cur->next->prev = cur->prev;cur->prev->next = cur->next;moveToFirst(cur);return cur->val;}}void set(int key, int value) {if (capacity == 0) return;if (mp.find(key) == mp.end()) { // not foundif (size >= capacity) {// remove last oneNode* deltmp = tail->prev;deltmp->prev->next = tail;tail->prev = deltmp->prev;unordered_map<int, Node*>::iterator it = mp.find(deltmp->key);mp.erase(it);delete deltmp;                size--;}Node* addtmp = new Node(key, value);moveToFirst(addtmp);mp[key] = addtmp;size++;}else { // foundNode* cur = mp.find(key)->second;cur->val = value;cur->next->prev = cur->prev;cur->prev->next = cur->next;moveToFirst(cur);}}private:unordered_map<int, Node*> mp;int capacity = 0;int size = 0;Node* head = NULL;Node* tail = NULL;void moveToFirst(Node* cur) {cur->next = head->next;cur->prev = cur->next->prev;head->next = cur;cur->next->prev = cur;}
};

  

转载于:https://www.cnblogs.com/lautsie/p/3512059.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/80467.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息