146. LRU Cache
https://leetcode.com/problems/lru-cache/description/
Thoughts
Code
/*
* @lc app=leetcode id=146 lang=cpp
*
* [146] LRU Cache
*/
// @lc code=start
class LRUCache {
public:
class Node {
public:
int key, val;
Node *pre = nullptr, *next = nullptr;
Node(int k, int v): key(k), val(v) {}
};
Node *head, *tail;
unordered_map<int, Node*> m;
int K;
LRUCache(int capacity) {
head = new Node(-1, -1);
tail = new Node(-1, -1);
head->next = tail;
tail->pre = head;
K = capacity;
}
void rm(Node *node) {
node->pre->next = node->next;
node->next->pre = node->pre;
}
void add(Node *node) {
node->next = head->next;
node->pre = head;
head->next = node;
node->next->pre = node;
}
void update(Node *node) {
rm(node);
add(node);
}
int get(int key) {
if (!m.count(key)) return -1;
auto node = m[key];
update(node);
return node->val;
}
void put(int key, int value) {
if (m.count(key)) {
auto node = m[key];
node->val = value;
update(node);
} else {
Node *node = new Node(key, value);
if (m.size() == K) {
m.erase(tail->pre->key);
rm(tail->pre);
}
add(node);
m[key] = node;
}
}
};
/**
* 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);
*/
// @lc code=end
Analysis
Last updated