题意:
方法:
模拟
思路:利用数据结构 list 和 map 实现。重点:利用 list 模拟缓冲的大小和表示最近一次操作(get 或 set)。list 的第一个元素表示最近一次的操作。
遍历操作数组:
1.get操作:
如果发现键存储,则返回对应的值,并且删除 list 对应的值,再重新将值加入list 的首部。
如果发现键不存在,则返回-1。
2.set操作:
如果发现键存储,则修改对应的值,并且删除 list 对应的值,再重新将值加入list 的首部。如果发现键不存在,则说明是插入新的值,这时又得判断 list (即缓冲)的大小:a.如果list 已满,则删除 list 的最后一个元素,并将新值加入 list 的首部;b.如果list 未满,则直接将新值加入 list 的首部。
class Solution {
public:
unordered_map<int,int> mp;//键值对
unordered_map<int,list<int>::iterator> mp2;//值到list地址的映射
list<int> ls;
int m;
vector<int> res;
vector<int> LRU(vector<vector<int> >& operators, int k) {
int n=operators.size();
m=k;
for(int i=0;i<n;i++){//遍历操作数组
if(operators[i][0]==1){
set(operators[i][1],operators[i][2]);
}else{
get(operators[i][1]);
}
}
return res;
}
void set(int x,int y){
if(mp.count(x)){//重新赋值
mp[x]=y;
// 删除原来的位置,得到最左的位置(最新)
ls.erase(mp2[x]);
ls.push_front(x);
mp2[x]=ls.begin();
}else{
mp[x]=y; // 无脑先插入
ls.push_front(x);
mp2[x]=ls.begin();
if(ls.size()>m){// 如果超过缓存大小,则删除末尾元素
mp.erase(mp.find(ls.back()));
mp2.erase(mp2.find(ls.back()));
ls.pop_back();
}
}
}
void get(int x){
if(mp.count(x)){//存在key
res.push_back(mp[x]);
//最近一次(头插法)
// 删除原来的位置,得到最左的位置(最新)
ls.erase(mp2[x]);//删除指定值x
ls.push_front(x);//头插法
mp2[x]=ls.begin();//值到list地址的映射
}else{//不存在key
res.push_back(-1);
}
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号