题解 | #设计LRU缓存结构#
设计LRU缓存结构
http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61
为了方便插入和删除操作,选用双向链表list作为缓存的数据结构,因为要存的是一个int型键值对,所以用list<list<int>>结构。list在做插入以及将结点移至头部的操作时都十分方便,美中不足的是在查找时需要遍历链表。
从提交结果来看运行速度有点出乎我的预料。
代码仍有较大改进空间,欢迎大家指正。</int>
vector<int> LRU(vector<vector<int> >& operators, int k) {
// write code here
vector<int> result;//存储输出结果
list<list<int>> arr;//缓存数据结构
for(vector<vector<int>>::const_iterator iter = operators.cbegin();iter != operators.cend();iter++){
if(iter->at(0) == 1){
int x = iter->at(1);
int y = iter->at(2);
if(arr.size() == k ){//若缓存已满,从链表尾部删除结点
arr.pop_back();
}
list<int> item;
item.push_front(y);
item.push_front(x);
arr.push_front(item);//将结点插入表头
}else{
int x = iter->at(1);
list<list<int>>::iterator it = arr.begin();
int flag = 0;//标示是否找到目标结点
int control = 0;//控制遍历,如果不使用该变量会发生iterator越界
while(it != arr.end()){//遍历查找结点
if(it->front() == x){
result.push_back(it->back());
arr.push_front(*it);//将目标结点插入队头
arr.erase(it);//从队中删除目标结点
flag = 1;
break;
}
control++;
if(control >= arr.size()){
break;
}
it++;
}
if(flag == 0){
result.push_back(-1);
}
}
}
return result;
}
};
汤臣倍健公司氛围 396人发布