Skip to content

Commit f1a1df4

Browse files
committed
updated 146 solution
1 parent cd6bb61 commit f1a1df4

File tree

1 file changed

+64
-35
lines changed

1 file changed

+64
-35
lines changed

0146-lru-cache.cpp

Lines changed: 64 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,86 @@
11
/*
22
146. LRU Cache
33
4-
Submitted: November 27, 2024
4+
Submitted: November 30, 2024
55
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%)
88
*/
99

1010
class LinkedList {
1111
public:
1212
struct Node {
13+
int key;
1314
int val;
1415
Node* prev;
1516
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) {}
1819
};
1920
typedef unsigned short size_type;
2021
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);
2324
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+
}
2430
public:
2531
LinkedList() {
2632
head->next = tail;
2733
tail->prev = head;
2834
}
2935

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;
3943
}
4044

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);
4653
return newNode;
4754
}
4855

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);
5173
}
5274

53-
size_type size() {
75+
inline void removeFromTail() {
76+
remove(tail->prev);
77+
}
78+
79+
size_type size() const {
5480
return currentSize;
5581
}
5682

57-
Node* back() {
83+
Node* back() const {
5884
return tail->prev;
5985
}
6086

@@ -63,26 +89,29 @@ class LinkedList {
6389
class LRUCache {
6490
private:
6591
const LinkedList::size_type capacity;
66-
unordered_map<int, pair<int, LinkedList::Node*>> map;
92+
unordered_map<int, LinkedList::Node*> map;
6793
LinkedList list;
6894
public:
6995
LRUCache(int capacity) : capacity((LinkedList::size_type) capacity) {}
7096

7197
int get(int key) {
7298
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;
76101
}
77-
else return -1;
102+
return -1;
78103
}
79104

80105
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);
86115
}
87116
}
88117
};

0 commit comments

Comments
 (0)