-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy path0460-lfu-cache.cpp
44 lines (35 loc) · 1.23 KB
/
0460-lfu-cache.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class LFUCache {
int capacity, minFreq;
unordered_map<int, pair<int, int>> keyValFreq;
unordered_map<int, list<int>> freqKey;
unordered_map<int, list<int>::iterator> keyIter;
public:
LFUCache(int capacity) : capacity(capacity) {}
int get(int key) {
if (keyValFreq.find(key) == keyValFreq.end()) return -1;
int freq = keyValFreq[key].second;
freqKey[freq++].erase(keyIter[key]);
freqKey[freq].emplace_front(key);
keyIter[key] = freqKey[freq].begin();
keyValFreq[key].second = freq;
if (freqKey[minFreq].empty()) minFreq = freq;
return keyValFreq[key].first;
}
void put(int key, int value) {
if (capacity <= 0) return;
if (get(key) != -1) {
keyValFreq[key].first = value;
return;
}
if (keyValFreq.size() == capacity) {
int delKey = freqKey[minFreq].back();
freqKey[minFreq].pop_back();
keyValFreq.erase(delKey);
keyIter.erase(delKey);
}
minFreq = 1;
keyValFreq[key] = make_pair(value, minFreq);
freqKey[minFreq].emplace_front(key);
keyIter[key] = freqKey[minFreq].begin();
}
};