题解 | #设计LRU缓存结构#
设计LRU缓存结构
http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61
C++题解
访问时间复杂度O(1)则用hash表,插入删除时间复杂度O(1)则用链表。此题可用STL list+unordered_map组合的方式,双向链表用于维护key值得访问时间,最久未访问的位于链表表头。哈希表用于保存key-value键值对:
set:
1、当缓存结构中的元素不足k个时,直接插入;
2、当缓存元素中的个数满了之后插入元素,则先在map中查找key,找到说明key在缓存结构中,则更新链表和map;若找不到则将链表表头移除(删除最久未访问节点),然后将表头对应的map中的键值对删除,之后在插入新的键值对即可。
get:
在map中查找key,找到则更新链表并返回相应value值,找不到则返回-1。
代码如下:
class Solution {
public:
list<int> lru;//记录更新信息
unordered_map<int, int> Map;//记录具体key-value键值对
int Max;//缓存结构最大值
void set(vector<int>& opt)
{
if(Max-- > 0)//元素个数小雨k时,直接插入即可
{
lru.push_back(opt[1]);
Map[opt[1]] = opt[2];
}
else
{
if(Map.find(opt[1]) != Map.end())//该key值已存在
{
//更新链表中key的访问优先级(表头表示最久未访问)
lru.remove(opt[1]); //删除链表中的已存在的key
lru.push_back(opt[1]);//将将key插入链表尾
Map[opt[1]] = opt[2];
}
else//key不存在
{
int key = lru.front();
Map.erase(key);
Map[opt[1]] = opt[2];
lru.erase(lru.begin());
lru.push_back(opt[1]);
}
}
}
int get(vector<int>&opt)
{
if(Map.find(opt[1]) != Map.end())//该key值已存在
{
lru.remove(opt[1]);
lru.push_back(opt[1]);
return Map[opt[1]];
}
else return -1;
}
vector<int> LRU(vector<vector<int> >& operators, int k) {
// write code here
vector<int> res;
Max = k;
for(auto& opt:operators)
{
if(opt[0] == 1) set(opt);
else res.push_back(get(opt));
}
return res;
}
};
查看12道真题和解析