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 | 输入 |
算法1
(双向链表 + 哈希表) $O(1)$
要实现最近使用LRU缓存机制,那么我们必须要做到如下几点:
- 能够在 $O(1)$时间内找到查找的节点
- 能够在 $O(1)$时间内完成节点的插入
- 能够动态维护节点的使用频率
那么,由于需要在 $O(1)$时间查找,因此很容易想到哈希表
由于需要在 $O(1)$时间插入,因此很容易想到链表
由于需要维护结点的使用频率,那么可以考虑使用双向链表:每次查找、插入的节点放在链表的一端,表示最近被使用过,那么另一端的最后一个节点就可以表示最近最少使用的节点
1 | class LRUCache { |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.