题目描述
请你设计并实现一个满足 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 | 输入 |
基本思路
使用哈希链表的结构LinkedHashMap
labuladong的解析 leetcode官方题解
代码分成以下几个部分:
定义
DlinkedNode
双向链表结构写关于
DlinkedNode
的常用操作(四个)- 添加
node
节点到头部 - 删除节点
node
- 当
get()
访问一个节点之后移动到队首 - 移出队尾的节点
- 添加
写
LRUCache
的两个方法get()
put()
1 | 举个例子: |
时间复杂度:对于 put
和 get
都是 O(1)
空间复杂度:O(capacity)
,因为哈希表和双向链表最多存储 capacity+1
个元素
java实现
1 | //leetcode官方代码(较简短) |