CodeACM
HOT 100 · 链表 · LC 146

LRU 缓存:ACM 模式刷题

按标准输入读取测试数据,输出结果后可在 CodeACM 在线运行和提交。

题目描述

请你设计并实现一个满足 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) 的平均时间复杂度运行。

输入格式

第一行输入缓存容量 capacity 和操作数 q。

接下来 q 行为操作:get key,或 put key value。

输出格式

每个 get 操作输出一行:若键存在则输出对应值,否则输出 −1。put 操作不输出。

数据范围

  • 1 ≤ capacity ≤ 3000
  • 1 ≤ q ≤ 2 × 10⁵
  • 0 ≤ key, value ≤ 10⁴

公开样例

样例 1

输入

2 9
put 1 1
put 2 2
get 1
put 3 3
get 2
put 4 4
get 1
get 3
get 4

输出

1
-1
-1
3
4

LRUCache lRUCache = new LRUCache(2);

lRUCache.put(1, 1); // 缓存是 {1=1}

lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}

lRUCache.get(1); // 返回 1

lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}

lRUCache.get(2); // 返回 -1(未找到)

lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}

lRUCache.get(1); // 返回 -1(未找到)

lRUCache.get(3); // 返回 3

lRUCache.get(4); // 返回 4

样例 2

输入

1 4
put 2 1
get 2
put 3 2
get 2

输出

1
-1

容量为 1,写入键 3 时淘汰键 2。

练习建议

先根据输入输出格式写出可运行程序,再用公开样例检查结果;遇到边界情况时,补充自测用例后提交。