第一版LRU算法
class LRUCache {
private:
struct Node{
int key;
int value;
Node(): key(0), value(0){}
};
int max_size = 0;
list<Node> LRU_list; //使用双链表存储Node节点
unordered_map<int, list<Node>::iterator> LRU_map;
public:
LRUCache(int capacity) {
max_size = capacity;
}
int get(int key) {
unordered_map<int, list<Node>::iterator>::iterator item = LRU_map.find(key);
if(item == LRU_map.end()) //cache没有命中
return -1;
//cache命中
list<Node>::iterator xitem = LRU_map[key];
Node newNode;
newNode.key = xitem->key;
newNode.value = xitem->value;
LRU_list.erase(xitem);
LRU_list.push_front(newNode);
LRU_map[key] = LRU_list.begin();
return LRU_list.front().value;
}
void put(int key, int value) {
unordered_map<int, list<Node>::iterator>::iterator item = LRU_map.find(key);
if(item == LRU_map.end()) {//cache没有命中
if(LRU_map.size() == max_size) //LRU_list满了
{
LRU_map.erase(LRU_list.back().key);
LRU_list.pop_back();
}
Node newNode;
newNode.key = key;
newNode.value = value;
LRU_list.push_front(newNode);
LRU_map[key] = LRU_list.begin();
}else{ //cache命中了
list<Node>::iterator xitem = LRU_map[key];
Node newNode;
newNode.key = key;
newNode.value = value;
LRU_list.erase(xitem);
LRU_list.push_front(newNode);
LRU_map[key] = LRU_list.begin();
}
}
};
/**
* Your LRUCache object will be instantiated and called as such:
* LRUCache* obj = new LRUCache(capacity);
* int param_1 = obj->get(key);
* obj->put(key,value);
*/
时间和空间消耗
18 / 18 test cases passed.
Status: Accepted
Runtime: 128 ms
Memory Usage: 40.2 MB