forked from gh877916059/LintCode
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path024. LFU缓存.cpp
61 lines (61 loc) · 1.35 KB
/
024. LFU缓存.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
class LFUCache
{
public:
vector<tuple<int, int, int> > huan_cun;
int capacity;
unordered_map<int, int> to_index;
LFUCache(int capacity)
{
this->capacity = capacity;
}
void set(int key, int value)
{
if (to_index.find(key) != to_index.end())
{
int index = to_index[key];
std::get<1>(huan_cun[index]) = value;
std::get<2>(huan_cun[index])++;
return;
}
else
{
if (huan_cun.size()<capacity)
{
}
else
{
auto i = huan_cun[huan_cun.size() - 1];
huan_cun.pop_back();
to_index.erase(std::get<0>(i));
}
huan_cun.push_back(make_tuple(key, value, 0));
to_index[key] = huan_cun.size() - 1;
}
for (int i = to_index[key]; i > 0; --i)
{
if (std::get<2>(huan_cun[i - 1]) <= std::get<2>(huan_cun[i]))
{
swap(huan_cun[i], huan_cun[i - 1]);
to_index[std::get<0>(huan_cun[i])] = i;
to_index[std::get<0>(huan_cun[i - 1])] = i - 1;
}
}
}
int get(int key)
{
if (to_index.find(key) == to_index.end())
{
return -1;
}
int index = to_index[key];
++std::get<2>(huan_cun[index]);
int result = std::get<1>(huan_cun[index]);
if (index>0 && std::get<2>(huan_cun[index - 1]) <= std::get<2>(huan_cun[index]))
{
swap(huan_cun[index], huan_cun[index - 1]);
to_index[std::get<0>(huan_cun[index])] = index;
to_index[std::get<0>(huan_cun[index - 1])] = index - 1;
}
return result;
}
};