class LFUCache {
public:
struct Node{
int key,val,t;
Node(int _key,int _val,int _t):key(_key),val(_val),t(_t){}
};
typedef list<Node>::iterator It;
int mint,capacity,sz;
map<int,list<Node>>mp;
map<int,It>vis;
LFUCache(int _capacity):mint(-1),capacity(_capacity),sz(0){}
void remove(list<Node>& ls,It it){
int t=it->t;
ls.erase(it);
if(t==mint&&mp[t].empty()) mint=t+1;
if(mp[t].empty()) mp.erase(t);
}
It add(int t,Node x){
if(!mp.count(t)) mp[t]=*(new list<Node>());
mp[t].push_front(x);
return mp[t].begin();
}
int get(int key) {
if(!capacity) return -1;
if(!vis.count(key)) return -1;
//从原来的链表移除并加入次数+1的新的链表 并更新vis
Node tmp=(*vis[key]);
remove(mp[tmp.t],vis[key]),vis[key]=add(++(tmp.t),tmp);
return tmp.val;
}
void put(int key, int value) {
if(!capacity) return;
if(!vis.count(key)&&++sz>capacity){
--sz;//删除最小次数的双向链表的末尾节点 并从vis中移除
Node tmp=*mp[mint].rbegin();
vis.erase(tmp.key),mp[mint].pop_back();//rbegin()不能强转为正向迭代器
if(tmp.t==mint&&mp[mint].empty()){
while(!mp.count(mint)) ++mint;
}
if(mp[tmp.t].empty()) mp.erase(tmp.t);
}
if(!vis.count(key)) vis[key]=add(1,*(new Node(key,value,1))),mint=1;
else vis[key]->val=value,get(key);
}
};
leetcode 460. LFU 缓存
最新推荐文章于 2024-05-09 22:44:17 发布