forked from wisdompeak/LeetCode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path460.LFU-Cache_v2.cpp
68 lines (54 loc) · 1.5 KB
/
460.LFU-Cache_v2.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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
class LFUCache {
unordered_map<int,int>key2value;
unordered_map<int, list<int>::iterator> key2iter;
unordered_map<int, int>key2freq;
unordered_map<int, list<int>>freq2list;
int cap, minFreq;
public:
LFUCache(int capacity)
{
cap = capacity;
minFreq = 0;
}
int get(int key)
{
if (key2value.find(key)==key2value.end())
return -1;
int f = key2freq[key];
freq2list[f].erase(key2iter[key]);
freq2list[f+1].push_back(key);
key2iter[key] = --freq2list[f+1].end();
key2freq[key] = f+1;
if (freq2list[minFreq].size()==0)
minFreq+=1;
return key2value[key];
}
void put(int key, int value)
{
if (cap==0) return;
if (get(key)!=-1)
{
key2value[key] = value;
return;
}
if (key2value.size()==cap)
{
int k = freq2list[minFreq].front();
key2value.erase(k);
key2iter.erase(k);
key2freq.erase(k);
freq2list[minFreq].pop_front();
}
key2value[key] = value;
key2freq[key] = 1;
freq2list[1].push_back(key);
key2iter[key] = --freq2list[1].end();
minFreq = 1;
}
};
/**
* Your LFUCache object will be instantiated and called as such:
* LFUCache* obj = new LFUCache(capacity);
* int param_1 = obj->get(key);
* obj->put(key,value);
*/