-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path146. LRU Cache.cpp
83 lines (79 loc) · 1.62 KB
/
146. LRU 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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <deque>
#include <unordered_map>
using namespace std;
class Node
{
public:
int k;
int val;
Node *prev;
Node *next;
Node(int key, int value)
{
k = key;
val = value;
prev = next = nullptr;
}
};
class LRUCache
{
public:
LRUCache(int capacity)
{
cap = capacity;
left = new Node(0, 0);
right = new Node(0, 0);
left->next = right;
right->prev = left;
}
int get(int key)
{
if (!cache.contains(key))
return -1;
remove(cache[key]);
insert(cache[key]);
return cache[key]->val;
}
void put(int key, int value)
{
if (cache.contains(key))
{
remove(cache[key]);
delete cache[key];
}
cache[key] = new Node(key, value);
insert(cache[key]);
if (cache.size() > cap)
{
auto lru = left->next;
remove(lru);
cache.erase(lru->k);
delete lru;
}
}
private:
unordered_map<int, Node *> cache;
int cap;
Node *left;
Node *right;
void remove(Node *node)
{
Node *prev = node->prev, *next = node->next;
prev->next = next;
next->prev = prev;
}
// Insert to right
void insert(Node *node)
{
Node *prev = right->prev, *next = right;
prev->next = next->prev = node;
node->prev = prev;
node->next = next;
}
};
/**
* Your LRUCache object will be instantiated and called as such:
* LRUCache* obj = new LRUCache(capacity);
* int param_1 = obj->get(key);
* obj->put(key,value);
*/