Leetcode 146:LRU 缓存机制
Leetcode 146:LRU 缓存机制
题目描述
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。
实现 LRUCache
类:
LRUCache(int capacity)
以正整数作为容量capacity
初始化 LRU 缓存int get(int key)
如果关键字key
存在于缓存中,则返回关键字的值,否则返回-1
。void put(int key, int value)
如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。
进阶:你是否可以在 O(1)
时间复杂度内完成这两种操作?
示例
1 | 输入 |
提示:
1 <= capacity <= 3000
0 <= key <= 3000
0 <= value <= 104
- 最多调用
3 * 104
次get
和put
解题思路
LRU缓存机制需要两点:
- 判断一个 key 是否已经在 cache 中;
- 对 cache 需要频繁大量的插入和删除操作;
根据这两者要求,要想实现 O(1)的时间复杂度,我们使用 map + 双向链表的方式去实现。map用来判断一个 key 是否已经在 cache 中,双向链表来作为 cache 。
容易出现的错误有:
- 申请的内存空间忘记释放,造成内存泄露;
- 在 put 函数中需要初始化 cache 的容量,判断当前cache的 size 是否已经超过了容量;
一个小技巧:
为了避免对头结点和尾结点的特判,我们可以在首尾各加入一个伪结点。
示例代码
1 | struct DLinkedNode |
**PS: ** 改来改去,最终还是改为了官方答案的样子,sad……
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 二进制的叮当喵!