C++,双链表+hashmap,面向对象题解。插入、读取复杂度均为O(1)
struct DLinkedList{
int key;
int value;
DLinkedList *pre;
DLinkedList *next;
};
class LRUCache{
private:
int MAX_;
int cnt=0;
DLinkedList *head,*tail;
unordered_map<int,DLinkedList*> rem;
public:
LRUCache(int max_){
this->MAX_=max_;
head=new DLinkedList();
tail=new DLinkedList();
head->pre=nullptr;
head->next=tail;
tail->pre=head;
tail->next=nullptr;
}
void addHead(DLinkedList *ll){
auto nxt=head->next;
head->next=ll;
ll->pre=head;
ll->next=nxt;
nxt->pre=ll;
}
void remove(DLinkedList *ll){
auto left=ll->pre;
auto right=ll->next;
left->next=right;
right->pre=left;
}
DLinkedList* popTail(){
auto ll=tail->pre;
remove(ll);
return ll;
}
void refresh(DLinkedList *ll){
remove(ll);
addHead(ll);
}
void set(int key,int val){
if(rem.find(key)!=rem.end()){
auto ll=rem[key];
ll->value=val;
refresh(ll);
}else{
auto ll=new DLinkedList();
ll->key=key;
ll->value=val;
rem[key]=ll;
addHead(ll);
cnt++;
if(cnt>MAX_){
auto ll=popTail();
rem.erase(ll->key);
cnt--;
}
}
}
int get(int key){
if(rem.find(key)!=rem.end()){
auto ll=rem[key];
refresh(ll);
return ll->value;
}else{
return -1;
}
}
};
class Solution {
public:
/**
* lru design
* @param operators int整型vector<vector<>> the ops
* @param k int整型 the k
* @return int整型vector
*/
vector<int> LRU(vector<vector<int> >& operators, int k) {
// write code here
LRUCache lru(k);
vector<int> res;
for(auto oper:operators){
if(oper[0]==1){
lru.set(oper[1], oper[2]);
}else if(oper[0]==2){
res.push_back(lru.get(oper[1]));
}
}
return res;
}
};