Skip to content

Commit 2585bbd

Browse files
committed
Update 146.lru-cache.md
1 parent 4e3f363 commit 2585bbd

File tree

1 file changed

+15
-29
lines changed

1 file changed

+15
-29
lines changed

problems/146.lru-cache.md

+15-29
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,27 @@
1-
# 题目地址(146. LRU缓存机制)
1+
## 题目地址(146. LRU缓存机制)
22

33
https://leetcode-cn.com/problems/lru-cache/
44

55
## 题目描述
66

7-
```
87
运用你所掌握的数据结构,设计和实现一个 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-
158

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)` 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。
1713

18-
14+
**进阶**:你是否可以在 `O(1)` 时间复杂度内完成这两种操作?
1915

2016
示例:
21-
17+
```
2218
输入
23-
2419
["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]
2520
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
2621
输出
2722
[null, null, null, 1, null, -1, null, -1, 3, 4]
28-
解释
2923
24+
解释
3025
LRUCache lRUCache = new LRUCache(2);
3126
lRUCache.put(1, 1); // 缓存是 {1=1}
3227
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
@@ -39,27 +34,17 @@ lRUCache.get(3); // 返回 3
3934
lRUCache.get(4); // 返回 4
4035
```
4136

42-
## 哈希法
43-
44-
### 思路
37+
### 思路: 哈希法
4538

4639
1. 确定需要使用的数据结构
47-
4840
1. 根据题目要求,存储的数据需要保证顺序关系(逻辑层面) ===> 使用数组,链表等保证顺序关系
49-
5041
2. 同时需要对数据进行频繁的增删, 时间复杂度 O(1) ==> 使用链表等
51-
5242
3. 对数据进行读取时, 时间复杂度 O(1) ===> 使用哈希表
53-
5443
最终采取双向链表 + 哈希表
55-
5644
> 1. 双向链表按最后一次访问的时间的顺序进行排列, 链表头部为最近访问的节点
5745
> 2. 哈希表,以关键字为键,以链表节点的地址为值
58-
5946
2. put 操作
60-
6147
通过哈希表, 查看传入的关键字对应的链表节点, 是否存在
62-
6348
1. 如果存在,
6449
1. 将该链表节点的值更新
6550
2. 将该该链表节点调整至链表头部
@@ -72,17 +57,14 @@ lRUCache.get(4); // 返回 4
7257
2. 新生成节点
7358
3. 将该节点位置调整至链表头部
7459
3. 将新生成的节点,按关键字为键,节点地址为值插入哈希表
75-
7660
3. get 操作
77-
7861
通过哈希表, 查看传入的关键字对应的链表节点, 是否存在
79-
8062
1. 节点存在
8163
1. 将该节点位置调整至链表头部
8264
2. 返回该节点的值
8365
2. 节点不存在, 返回 null
8466

85-
伪代码:
67+
- 伪代码
8668

8769
```js
8870
var LRUCache = function(capacity) {
@@ -119,7 +101,9 @@ function put (key, value) {
119101
};
120102
```
121103

122-
JS 代码参考:
104+
- 语言支持: JS, Go, PHP
105+
106+
JS Code:
123107

124108
```js
125109
function ListNode(key, val) {
@@ -191,6 +175,7 @@ function removeTail() {
191175
```
192176

193177
Go Code:
178+
194179
```go
195180
type LRUCache struct {
196181
Cap int
@@ -279,6 +264,7 @@ func (dl *DoubleList) remove(n *DoubleListNode) {
279264
```
280265

281266
PHP Code:
267+
282268
```php
283269
class LRUCache
284270
{

0 commit comments

Comments
 (0)