LRU LeetCode
一、题目描述
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。
实现 LRUCache 类:
LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。
进阶:你是否可以在 O(1) 时间复杂度内完成这两种操作?
提示:
1 <= capacity <= 3000
0 <= key <= 10000
0 <= value <= 105
最多调用 2 * 10^5 次 get 和 put
二、解题思路
实现本题的两种操作,需要用到一个哈希表和一个双向链表。在 Python 语言中,有一种结合了哈希表与双向链表的数据结构 OrderedDict,只需要短短的几行代码就可以完成本题。
在 Java 语言中,同样有类似的数据结构
LinkedHashMap。
三、代码
1、Python
class LRUCache(collections.OrderedDict):
def __init__(self, capacity: int):
super().__init__()
self.capacity = capacity
def get(self, key: int) -> int:
if key not in self:
return -1
self.move_to_end(key)
return self[key]
def put(self, key: int, value: int) -> None:
if key in self:
self.move_to_end(key)
self[key] = value
if len(self) > self.capacity:
self.popitem(last=False)
2、Java
class LRUCache extends LinkedHashMap<Integer, Integer>{
private int capacity;
public LRUCache(int capacity) {
super(capacity, 0.75F, true);
this.capacity = capacity;
}
public int get(int key) {
return super.getOrDefault(key, -1);
}
public void put(int key, int value) {
super.put(key, value);
}
@Override
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
return size() > capacity;
}
}
三、复杂度分析
时间复杂度:对于 put 和 get 都是 O(1)。
空间复杂度:O(capacity),因为哈希表和双向链表最多存储 capacity+1 个元素。
LRU LeetCode相关推荐
- java lru lfu_内存淘汰机制——LRU与LFU
内存淘汰机制之LRU与LFU LRU(Least Recently Used):淘汰 近期最不会访问的数据 LFU(Least Frequently Used):淘汰 最不经常使用(访问次数少) 所谓 ...
- taoqick 搜索自己CSDN博客
L1 L2正则化和优化器的weight_decay参数 kaiming初始化的推导 Pytorch动态计算图 Pytorch自动微分机制 PyTorch中在反向传播前为什么要手动将梯度清零? 通俗讲解 ...
- LeetCode实战:LRU缓存机制
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Design and ...
- LeetCode:146_LRU cache | LRU缓存设计 | Hard
题目:LRU cache Design and implement a data structure for Least Recently Used (LRU) cache. It should su ...
- LeetCode LRU Cache(最近最少使用缓存)
问题:设计一个最近最少使用缓存.支持get和put操作 1.如果get(key)中,key在缓存中不存在,返回-1 2.put(key,value),如果key在缓存中不存在,则插入.当缓存到达容量时 ...
- 【LeetCode】LRU Cache 解决报告
插话:只写了几个连续的博客,博客排名不再是实际"远在千里之外"该.我们已经进入2一万内. 再接再厉.油! Design and implement a data structure ...
- [LeetCode]LRU Cache有个问题,求大神解答【已解决】
题目: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the ...
- LeetCode 146. LRU缓存机制(哈希链表)
文章目录 1. 题目信息 2. 解题 2.1 手动实现list 2.2 使用内置list 1. 题目信息 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作 ...
- LeetCode —— 146. LRU缓存机制(Python)
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果关键字 (key) 存 ...
最新文章
- 深入理解PHP原理之变量(Variables inside PHP)
- 开源项目中成长:从实习小白到核心开发者
- Java学习个人备忘录之线程间的通信
- 计网 - 网络 I/O 模型:BIO、NIO 和 AIO 有什么区别?
- 感谢您的提问_感谢您的反馈,我们正在改进的5种方法
- 全球首例无人车撞人致死事故判决:Uber无罪,安全员要进一步调查
- 遍历字典时用与不用iter的区别
- Eclipse主题下载安装
- C/C++基础学习代码(1)
- 贪心法--->1.会议安排问题
- 基于stm32的智能输液系统设计
- iphone,ipad 尺寸,iphone常用控件尺寸
- matlab postscript,Postscript软件特点全面解析
- “另类”计算IP地址和子网划分
- 写了placement new也要写placement delete——条款52
- 程序员自我修养笔记:第九章
- sap pi的操作1
- 电容的材质资料/什么cog,x5r y5v等知识
- Life with qmail -- 中文版(英文版本16 Aug 2003)
- Angular--A required parameter cannot follow an optional parameter.(必选参数不能位于可选参数后)
热门文章
- [Leetcode总结] 104.二叉树的最大深度
- 详细图文演示——排除启动类故障以及Linux操作系统引导、运行级别和优化启动等相关知识
- html5 制作神器,HTML5/Canvas 简单的泡沫生成器
- python for arcgis_面向ArcGIS的Python脚本编程 ([美]赞德伯根) 中文pdf扫描版[50MB]
- 一文搞定Linux shell脚本编程( 史上最全汇总 )
- myeclipse写简单bbs代码_RabbitMQ实现即时通讯居然如此简单!连后端代码都省得写了?...
- android布局DSL,android – 使用自定义Anko布局DSL解除警报对话框
- Dws同步mysql数据_数据库技术丨GaussDB(DWS)数据同步状态查看方法
- python树形_Python处理树形数组
- html动画曲线快速结束,css3动画如何在动作结束时保持该状态不变