题解 | #设计LRU缓存结构#
C++ 解法
class Solution {
public:
/**
* lru design
* @param operators int整型vector<vector<>> the ops
* @param k int整型 the k
* @return int整型vector
*/
struct DLinkedNode {
int key, val;
DLinkedNode *prev, *next;
DLinkedNode(): key(0), val(0), prev(nullptr), next(nullptr) {}
DLinkedNode(int key, int val): key(key), val(val), prev(nullptr), next(nullptr) {}
};
class LRU_INIT {
public:
LRU_INIT(int capacity): size(0), capacity(capacity) {
head = new DLinkedNode();
tail = new DLinkedNode();
head->next = tail;
tail->prev = head;
}
int get(int key) {
if (!cache.count(key)) {
return -1;
} else {
DLinkedNode *node = cache[key];
removeNode(node);
addToHead(node);
return node->val;
}
return -1;
}
void set(int key, int val) {
if (!cache.count(key)) {
DLinkedNode *node = new DLinkedNode(key, val);
addToHead(node);
++size;
cache.insert(make_pair(key, node));
if (size > capacity) {
DLinkedNode *node = tail->prev;
removeNode(node);
--size;
cache.erase(node->key);
delete node;
}
} else {
DLinkedNode *node = cache[key];
node->val = val;
removeNode(node);
addToHead(node);
}
return ;
}
private:
int size, capacity;
DLinkedNode *head, *tail;
unordered_map<int, DLinkedNode *> cache;
void addToHead(DLinkedNode *node) {
node->next = head->next;
node->prev = head;
head->next->prev = node;
head->next = node;
return ;
}
void removeNode(DLinkedNode *node) {
node->prev->next = node->next;
node->next->prev = node->prev;
return ;
}
};
vector<int> LRU(vector<vector<int> >& operators, int k) {
LRU_INIT lru(k);
vector<int> ans;
for (vector<int> &v : operators) {
if (v[0] == 1) {
lru.set(v[1], v[2]);
} else if (v[0] == 2) {
int t = lru.get(v[1]);
ans.push_back(t);
}
}
return ans;
}
}; 
京公网安备 11010502036488号