0%

LeetCode 146.LRU缓存

传送门

设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:

  • LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
  • void put(int key, int value)如果关键字key 已经存在,则变更其数据值value ;如果不存在,则向缓存中插入该组key-value 。如果插入操作导致关键字数量超过capacity ,则应该 逐出 最久未使用的关键字。

函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。


代码

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
84
85
class LRUCache {
public:
LRUCache(int capacity) {
q.size = capacity;
f.clear();
}

int get(int key) {
if (f.count(key)) {
CacheNode *node = f[key];
q.remove(node);
q.push_front(node);
return node->val;
}
return -1;
}

void put(int key, int value) {
if (f.count(key)) {
CacheNode *node = f[key];
node->val = value;
q.remove(node);
q.push_front(node);
} else {
CacheNode *node = new CacheNode(key, value);
if (q.size == 0) {
q.push_front(node);
f.erase(q.tail->prev->key);
q.pop_back();
f[key] = node;
} else {
q.push_front(node);
--q.size;
f[key] = node;
}
}
}
private:
struct CacheNode {
int key, val;
CacheNode *prev;
CacheNode *next;
CacheNode() {}
CacheNode(int key, int val):key(key), val(val), prev(NULL), next(NULL) {}
};

struct CacheList {
CacheNode *head = new CacheNode(0, 0);
CacheNode *tail = new CacheNode(0, 0);
int size;

CacheList() {
head->next = tail;
tail->prev = head;
}

void push_front(CacheNode *node) {
node->prev = head;
node->next = head->next;
head->next->prev = node;
head->next = node;
}

void remove(CacheNode *node) {
node->prev->next = node->next;
node->next->prev = node->prev;
}

void pop_back() {
CacheNode *node = tail->prev;
remove(node);
delete(node);
}
};

CacheList q{};
unordered_map<int, CacheNode*> f;
};

/**
* 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);
*/