题目
Leetcode 460. LFU 缓存
代码(8.30 首刷看解析)
#include <unordered_map>
#include <unordered_set>
class Solution {
public:
vector<int> LFU(vector<vector<int> >& operators, int k) {
this->cap = k;
this->minFreq = 0;
vector<int> res;
for (auto& v : operators) {
int opt = v[0];
if(opt == 1) {
set(v[1], v[2]);
} else {
res.emplace_back(get(v[1]));
}
}
return res;
}
int get(int key) {
if(!key2val.count(key))
return -1;
increaseFreq(key);
return key2val[key];
}
void set(int key, int value) {
if(this->cap <= 0)
return;
if(key2val.count(key)) {
increaseFreq(key);
key2val[key] = value;
return;
}
if(key2val.size() >= this->cap) {
auto& ls = freq2keys[minFreq];
int deleteKey = ls.back();
ls.pop_back();
if(ls.empty()) {
freq2keys.erase(minFreq);
}
key2val.erase(deleteKey);
key2freq.erase(deleteKey);
}
key2val[key] = value;
key2freq[key] = 1;
freq2keys[1].push_front(key);
this->minFreq = 1;
}
private:
void increaseFreq(int key) {
int freq = key2freq[key];
key2freq[key]++;
freq2keys[freq].remove(key);
if(freq2keys[freq].empty()) {
freq2keys.erase(freq);
if(this->minFreq == freq)
this->minFreq++;
}
freq2keys[freq+1].push_front(key);
}
int minFreq;
int cap;
unordered_map<int, int> key2val;
unordered_map<int, int> key2freq;
unordered_map<int, list<int>> freq2keys;
};