为了方便插入和删除操作,选用双向链表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; } };