1
- # 题目地址(146. LRU缓存机制)
1
+ ## 题目地址(146. LRU缓存机制)
2
2
3
3
https://leetcode-cn.com/problems/lru-cache/
4
4
5
5
## 题目描述
6
6
7
- ```
8
7
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。
9
- 实现 LRUCache 类:
10
-
11
- LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
12
- int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
13
- void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。
14
-
15
8
16
- 进阶:你是否可以在 O(1) 时间复杂度内完成这两种操作?
9
+ 实现 ` LRUCache ` 类:
10
+ - ` LRUCache(int capacity) ` 以正整数作为容量 ` capacity ` 初始化 LRU 缓存
11
+ - ` int get(int key) ` 如果关键字 ` key ` 存在于缓存中,则返回关键字的值,否则返回 -1 。
12
+ - ` void put(int key, int value) ` 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。
17
13
18
-
14
+ ** 进阶 ** :你是否可以在 ` O(1) ` 时间复杂度内完成这两种操作?
19
15
20
16
示例:
21
-
17
+ ```
22
18
输入
23
-
24
19
["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]
25
20
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
26
21
输出
27
22
[null, null, null, 1, null, -1, null, -1, 3, 4]
28
- 解释
29
23
24
+ 解释
30
25
LRUCache lRUCache = new LRUCache(2);
31
26
lRUCache.put(1, 1); // 缓存是 {1=1}
32
27
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
@@ -39,27 +34,17 @@ lRUCache.get(3); // 返回 3
39
34
lRUCache.get(4); // 返回 4
40
35
```
41
36
42
- ## 哈希法
43
-
44
- ### 思路
37
+ ### 思路: 哈希法
45
38
46
39
1 . 确定需要使用的数据结构
47
-
48
40
1 . 根据题目要求,存储的数据需要保证顺序关系(逻辑层面) ===> 使用数组,链表等保证顺序关系
49
-
50
41
2 . 同时需要对数据进行频繁的增删, 时间复杂度 O(1) ==> 使用链表等
51
-
52
42
3 . 对数据进行读取时, 时间复杂度 O(1) ===> 使用哈希表
53
-
54
43
最终采取双向链表 + 哈希表
55
-
56
44
> 1 . 双向链表按最后一次访问的时间的顺序进行排列, 链表头部为最近访问的节点
57
45
> 2 . 哈希表,以关键字为键,以链表节点的地址为值
58
-
59
46
2 . put 操作
60
-
61
47
通过哈希表, 查看传入的关键字对应的链表节点, 是否存在
62
-
63
48
1 . 如果存在,
64
49
1 . 将该链表节点的值更新
65
50
2 . 将该该链表节点调整至链表头部
@@ -72,17 +57,14 @@ lRUCache.get(4); // 返回 4
72
57
2 . 新生成节点
73
58
3 . 将该节点位置调整至链表头部
74
59
3 . 将新生成的节点,按关键字为键,节点地址为值插入哈希表
75
-
76
60
3 . get 操作
77
-
78
61
通过哈希表, 查看传入的关键字对应的链表节点, 是否存在
79
-
80
62
1 . 节点存在
81
63
1 . 将该节点位置调整至链表头部
82
64
2 . 返回该节点的值
83
65
2 . 节点不存在, 返回 null
84
66
85
- 伪代码:
67
+ - 伪代码
86
68
87
69
``` js
88
70
var LRUCache = function (capacity ) {
@@ -119,7 +101,9 @@ function put (key, value) {
119
101
};
120
102
```
121
103
122
- JS 代码参考:
104
+ - 语言支持: JS, Go, PHP
105
+
106
+ JS Code:
123
107
124
108
``` js
125
109
function ListNode (key , val ) {
@@ -191,6 +175,7 @@ function removeTail() {
191
175
```
192
176
193
177
Go Code:
178
+
194
179
``` go
195
180
type LRUCache struct {
196
181
Cap int
@@ -279,6 +264,7 @@ func (dl *DoubleList) remove(n *DoubleListNode) {
279
264
```
280
265
281
266
PHP Code:
267
+
282
268
``` php
283
269
class LRUCache
284
270
{
0 commit comments