1
1
/*
2
2
146. LRU Cache
3
3
4
- Submitted: November 27 , 2024
4
+ Submitted: November 30 , 2024
5
5
6
- Runtime: 81 ms (beats 66.53 %)
7
- Memory: 182.14 MB (beats 24.43 %)
6
+ Runtime: 67 ms (beats 85.54 %)
7
+ Memory: 173.16 MB (beats 55.15 %)
8
8
*/
9
9
10
10
class LinkedList {
11
11
public:
12
12
struct Node {
13
+ int key;
13
14
int val;
14
15
Node* prev;
15
16
Node* next;
16
- Node (int val, Node* prev, Node* next) : val(val), prev(prev), next(next) {}
17
- Node (int val) : Node(val, nullptr , nullptr ) {}
17
+ Node (int key, int val, Node* prev, Node* next) : key(key), val(val), prev(prev), next(next) {}
18
+ inline Node (int key, int val) : Node(key, val, nullptr , nullptr ) {}
18
19
};
19
20
typedef unsigned short size_type;
20
21
private:
21
- Node* const head = new Node(-1 );
22
- Node* const tail = new Node(-2 );
22
+ Node* const head = new Node(-1 , - 1 );
23
+ Node* const tail = new Node(-2 , - 2 );
23
24
size_type currentSize = 0 ;
25
+
26
+ inline void validateNode (Node* node) const {
27
+ if (node == nullptr ) throw invalid_argument (" Node cannot be null" );
28
+ if (node == head || node == tail) throw invalid_argument (" Cannot modify head/tail node" );
29
+ }
24
30
public:
25
31
LinkedList () {
26
32
head->next = tail;
27
33
tail->prev = head;
28
34
}
29
35
30
- void removeNode (Node* node) {
31
- if (node == head || node == tail) throw invalid_argument (" Cannot remove head/tail node" );
32
- else {
33
- Node *prev = node->prev , *next = node->next ;
34
- prev->next = next;
35
- next->prev = prev;
36
- delete node;
37
- currentSize--;
38
- }
36
+ Node* remove (Node* node) {
37
+ validateNode (node);
38
+ Node *prev = node->prev , *next = node->next ;
39
+ prev->next = next;
40
+ next->prev = prev;
41
+ currentSize--;
42
+ return node;
39
43
}
40
44
41
- Node* addToHead (int val) {
42
- Node* newNode = new Node (val, head, head->next );
43
- head->next ->prev = newNode;
44
- head->next = newNode;
45
- currentSize++;
45
+ inline void removeAndDelete (Node* node) {
46
+ validateNode (node);
47
+ delete remove (node);
48
+ }
49
+
50
+ inline Node* addToHead (int key, int val) {
51
+ Node* newNode = new Node (key, val, head, head->next );
52
+ addToHead (newNode);
46
53
return newNode;
47
54
}
48
55
49
- void removeFromTail () {
50
- removeNode (tail->prev );
56
+ void addToHead (Node* node) {
57
+ node->prev = head;
58
+ node->next = head->next ;
59
+ head->next ->prev = node;
60
+ head->next = node;
61
+ currentSize++;
62
+ }
63
+
64
+ inline void moveToHead (Node* node) {
65
+ validateNode (node);
66
+ // cout << node->val << endl;
67
+ remove (node);
68
+ addToHead (node);
69
+ }
70
+
71
+ inline void removeAndDeleteFromTail () {
72
+ removeAndDelete (tail->prev );
51
73
}
52
74
53
- size_type size () {
75
+ inline void removeFromTail () {
76
+ remove (tail->prev );
77
+ }
78
+
79
+ size_type size () const {
54
80
return currentSize;
55
81
}
56
82
57
- Node* back () {
83
+ Node* back () const {
58
84
return tail->prev ;
59
85
}
60
86
@@ -63,26 +89,29 @@ class LinkedList {
63
89
class LRUCache {
64
90
private:
65
91
const LinkedList::size_type capacity;
66
- unordered_map<int , pair< int , LinkedList::Node*> > map;
92
+ unordered_map<int , LinkedList::Node*> map;
67
93
LinkedList list;
68
94
public:
69
95
LRUCache (int capacity) : capacity((LinkedList::size_type) capacity) {}
70
96
71
97
int get (int key) {
72
98
if (map.count (key)) {
73
- list.removeNode (map[key].second );
74
- map[key].second = list.addToHead (key);
75
- return map[key].first ;
99
+ list.moveToHead (map[key]);
100
+ return map[key]->val ;
76
101
}
77
- else return -1 ;
102
+ return -1 ;
78
103
}
79
104
80
105
void put (int key, int value) {
81
- if (map.count (key)) list.removeNode (map[key].second );
82
- map[key] = { value, list.addToHead (key) };
83
- while (list.size () > capacity) {
84
- map.erase (list.back ()->val );
85
- list.removeFromTail ();
106
+ if (map.count (key)) {
107
+ list.moveToHead (map[key]);
108
+ map[key]->val = value;
109
+ } else {
110
+ if (list.size () == capacity) {
111
+ map.erase (list.back ()->key );
112
+ list.removeAndDeleteFromTail ();
113
+ }
114
+ map[key] = list.addToHead (key, value);
86
115
}
87
116
}
88
117
};
0 commit comments