题解 | #设计LRU缓存结构#
设计LRU缓存结构
https://www.nowcoder.com/practice/5dfded165916435d9defb053c63f1e84
#include <cfloat> class Solution { public: using Node = struct DL { int key; int val; struct DL* pre; struct DL* next; }; unordered_map<int,Node*> map; int mSize,mCapacity; Node* head; Node* tail; Solution(int capacity){ // write code here mCapacity=capacity; mSize=0; head=new Node; tail=new Node; head->pre=tail->next=nullptr; head->next=tail; tail->pre=head; } int get(int key) { // write code here if(map.count(key)==0) return -1; Node* tmp=map[key]; int res=tmp->val; RemoveNode(tmp); AddTail(tmp); return res; } void AddTail(Node *n) { tail->pre->next=n; n->next=tail; n->pre=tail->pre; tail->pre=n; } void RemoveNode(Node* n) { n->pre->next=n->next; n->next->pre=n->pre; } void PopHead() { Node* tmp=head->next; head->next=head->next->next; head->next->pre=head; map.erase(tmp->key); delete tmp; } void set(int key, int value){ // write code here if(map.count(key)>0) { map[key]->val=value; RemoveNode(map[key]); AddTail(map[key]); } else { Node* tmp=new Node(); tmp->key=key; tmp->val=value; map[key]=tmp; AddTail(tmp); mSize++; if(mSize>mCapacity) { PopHead(); mSize--; } } } }; /** * Your Solution object will be instantiated and called as such: * Solution* solution = new Solution(capacity); * int output = solution->get(key); * solution->set(key,value); */