#include <list>
#include <unordered_map>
#include <vector>
class Solution {
public:
/**
* lfu design
* @param operators int整型vector<vector<>> ops
* @param k int整型 the k
* @return int整型vector
*/
vector<int> LFU(vector<vector<int> >& operators, int k) {
// write code here
vector<int> res;
free = k;
for (int i = 0; i < operators.size(); i++) {
auto op = operators[i];
if (op[0] == 1) {
//set操作
set(op[1], op[2]);
} else {
//get操作
res.push_back(get(op[1]));
}
}
return res;
}
private:
//vector (frequent, key, val)
unordered_map<int, list<vector<int> > > freq_mp;
unordered_map<int, list<vector<int> >::iterator> mp;
int min_freq = 0;//当前的最小频次
//缓存剩余容量
int free = 0;
void update(list<vector<int> >::iterator iter, int key, int value) {
int freq = (*iter)[0];
freq_mp[freq].erase(iter);
if (freq_mp[freq].empty()) {
freq_mp.erase(freq);
if (min_freq == freq) {
min_freq++;
}
}
freq_mp[freq+1].push_front({freq + 1, key, value});
mp[key] = freq_mp[freq + 1].begin();
}
void set(int key, int value) {
auto it = mp.find(key);
if (it != mp.end())
update(it->second, key, value);
else {
if (free == 0) {
int oldkey = freq_mp[min_freq].back()[1];
freq_mp[min_freq].pop_back();
if (freq_mp[min_freq].empty())
freq_mp.erase(min_freq);
mp.erase(oldkey);
} else {
free--;
}
min_freq = 1;
freq_mp[1].push_front({1, key, value});
mp[key] = freq_mp[1].begin();
}
}
int get(int key) {
int res = -1;
auto it = mp.find(key);
if (it != mp.end()) {
auto iter = it->second;
res = (*iter)[2];
update(iter, key, res);
}
return res;
}
};
两个哈希集合:一个哈希集合里面放置【频率,这个频率下相对应的链表】
一个哈希集合放置【key,相对应的节点】