问题描述如下:
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get
and set
.
get(key)
- Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.set(key, value)
- Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
考虑使用list(也可以自己实现双向链表)和Map(也可以自己实现hash表)
cpp代码如下:
class LRUCache{
private:
typedef struct Node{
int key;
int value;
Node(int k,int v):key(k),value(v){}
}Node;
int cap_;
list<Node> data;
map<int,list<Node>::iterator> quick_find;
public:
LRUCache(int capacity) {
cap_=capacity;
}
int get(int key) {
map<int,list<Node>::iterator>::iterator p=quick_find.find(key);
if(p==quick_find.end())return -1;
int value=p->second->value;
data.erase(p->second);
data.push_front(Node(key,value));
quick_find[key]=data.begin();
return value;
}
void set(int key, int value) {
map<int,list<Node>::iterator>::iterator p=quick_find.find(key);
if(p!=quick_find.end()){
data.erase(p->second);
data.push_front(Node(key,value));
quick_find[key]=data.begin();
return;
}
if((int)data.size()<cap_){
data.push_front(Node(key,value));
quick_find[key]=data.begin();
}else{
p=quick_find.find(data.back().key);
quick_find.erase(p);
data.pop_back();
data.push_front(Node(key,value));
quick_find[key]=data.begin();
}
}
};