题目描述:
思路:
首先,最直观的想法就是用STL中的list(双向链表)保存缓存中的key,表头节点表示最近操作的数据,表尾节点表示当前缓存中最少使用的数据,再利用map保存key-value。每次put操作时先用find函数在list中查找key,如果存在则将key换到list的表头;不存在就检查list是否已经满了,如果list已满就把表尾节点删除再在表头插入新节点,否则直接在表头插入新节点。
class LRU
{
public:
LRU(int capacity)
{
sz = capacity;
}
int get(int key)
{ //如果get时结点存在,那么需要把结点移动到list头部
if (ump.find(key) != ump.end())
{
put(key, ump[key]->second);
return ump[key]->second;
}
return -1;
}
void put(int key, int val)
{
//如果key已经存在list中,先删除该结点
if (ump.find(key) != ump.end())
{
lst.erase(ump[key]);
}
else if(lst.size()>=sz)//如果list容量已满,则删除list尾部的结点
{
ump.erase(lst.back().first);
lst.pop_back();
}
//把新结点添加在list的头部
lst.push_front({ key,val });
//保存结点到map中
ump[key] = lst.begin();
}
private:
int sz;
//list存储所有的key和val
list<pair<int, int>> lst;
//存储每一个key在list中的结点位置
unordered_map<int, list<pair<int, int>>::iterator> ump;
};