题意:
方法:
模拟
思路:利用数据结构 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); } } };
时间复杂度:空间复杂度: