【LeetCode】热题100: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) 的平均时间复杂度运行。
示例:
输入
["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -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
提示:
1 <= capacity <= 3000
0 <= key <= 10000
0 <= value <= 10^5
最多调用 2 * 10^5 次 get 和 put
解题思路:可以使用双向链表和哈希表来实现,双向链表用于维护数据存储顺序,保证最近访问的数据在链表头部,最久未使用的数据在链表尾部。哈希表用于快速定位数据是否存在以及获取对应的节点。在get操作时,如果关键字存在,通过哈希表定位后将对应节点移到链表头部,并返回值;否则返回-1。在put操作时,如果关键字不存在,创建新节点并添加至链表头部,同时更新哈希表;如果关键字存在,更新值并将节点移到链表头部。若缓存已满,则删除链表尾部节点,并更新哈希表。
class LRUCache {class ListNode {int key;int value;ListNode prev;ListNode next;}private Map<Integer, ListNode> cache;private int size;private int capacity;private ListNode head, tail;public LRUCache(int capacity) {this.capacity = capacity;this.size = 0;cache = new HashMap<>();// 使用伪头部和伪尾部节点简化边界情况处理head = new ListNode();tail = new ListNode();head.next = tail;tail.prev = head;}public int get(int key) {ListNode node = cache.get(key);if (node == null) {return -1;}// 如果 key 存在,先通过哈希表定位,再移到头部moveToHead(node);return node.value;}public void put(int key, int value) {ListNode node = cache.get(key);if (node == null) {// 如果 key 不存在,创建一个新的节点ListNode newNode = new ListNode();newNode.key = key;newNode.value = value;// 添加进哈希表cache.put(key, newNode);// 添加至双向链表的头部addToHead(newNode);size++;if (size > capacity) {// 如果超出容量,删除双向链表的尾部节点ListNode tail = removeTail();// 删除哈希表中对应的项cache.remove(tail.key);size--;}} else {// 如果 key 存在,先通过哈希表定位,再修改 value,并移到头部node.value = value;moveToHead(node);}}private void addToHead(ListNode node) {node.prev = head;node.next = head.next;head.next.prev = node;head.next = node;}private void removeNode(ListNode node) {node.prev.next = node.next;node.next.prev = node.prev;}private void moveToHead(ListNode node) {removeNode(node);addToHead(node);}private ListNode removeTail() {ListNode res = tail.prev;removeNode(res);return res;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/801648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是人工智能?人工智能、机器学习、深度学习三者之间有什么关系吗?

深度学习是机器学习的一个分支。深度学习是机器学习的一部分&#xff0c;与机器学习的其他分支学科&#xff0c;以及统计学、人工智能等学科都有着紧密的联系。深度学习、机器学习、人工智能、统计学之间的关系如图1-4所示。 图1-4 深度学习、机器学习、人工智能、统计学之间的…

【C语言】指针篇(指针数组,数组指针,函数指针,一级、二级指针)

文章目录 一、指针基础1.什么是指针2.指针的定义和初始化3.指针的解引用4.野指针和空指针5.指针的类型6.指针的大小7.指针的运算8.指针和数组9.指针和字符串10.二级指针 二、指针数组和数组指针1.指针数组2.数组指针3.练习 三、数组传参和指针传参1.一维数组传参2.二维数组传参…

Maven POM元素解析

这是对Maven中使用的Maven项目描述符的引用。 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/…

GEE:基于CHIRPS数据集的累积降水量影像下载

作者:CSDN @ _养乐多_ 本文将介绍在 Google Earth Engine(GEE)平台上使用“UCSB-CHG/CHIRPS/DAILY”数据集计算某一段时期(某年/某个季节/某月)的累积降雨量图像,并下载。 结果如下图所示, 文章目录 一、核心函数二、代码链接三、完整代码一、核心函数 .sum() // 对影…

02 Php学习:变量

Php 变量声明 Php 变量赋值 在PHP中&#xff0c;变量赋值是指将一个值赋给一个变量。变量赋值是 PHP 中最基本和常见的操作之一&#xff0c;以下是关于变量赋值的详细说明和示例&#xff1a; 变量赋值语法&#xff1a; $variable value;$variable&#xff1a;要赋值的变量名…

速盾:游戏cdn什么意思

CDN&#xff08;Content Delivery Network&#xff09;是指内容分发网络&#xff0c;它是由一组位于世界各地的服务器组成的网络&#xff0c;用于将内容有效地传输给用户。游戏CDN&#xff0c;顾名思义&#xff0c;就是用于游戏内容分发的网络。 在传统的网络传输模式中&#…

【MATLAB源码-第38期】基于OFDM的块状导频和梳状导频误码率性能对比,以及LS/LMMSE两种信道估计方法以及不同调制方式对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 块状导频和梳状导频都是用于无线通信系统中信道估计的方法。 块状导频&#xff1a; 定义&#xff1a; 在频域上&#xff0c;块状导频是连续放置的一组导频符号。这意味着所有的导频符号都集中在一个短的时间段内发送。 优点…

【Java编程进阶之路 11】Java内存管理深度剖析:垃圾回收机制与性能优化

文章目录 Java内存管理深度剖析&#xff1a;垃圾回收机制与性能优化引言01 Java内存管理基础1.1 堆&#xff08;Heap&#xff09;1.2 栈&#xff08;Stack&#xff09;1.3 方法区&#xff08;Method Area&#xff09;1.4 为什么需要垃圾回收&#xff1f; 02 垃圾回收的重要性2.…

php站长在线工具箱源码优化版

环境要求 PHP > 7.4MySQL > 5.6fileinfo扩展使用Redis缓存需安装Redis扩展 源码下载地址&#xff1a;php站长在线工具箱源码优化版.zip

计算机组成原理核心知识——计算机系统工作

目录 一、计算机运算&#xff08;一&#xff09;符号数和无符号数&#xff08;二&#xff09;定点数和浮点数&#xff08;三&#xff09;原码、反码、补码和移码 二、总线&#xff08;一&#xff09;系统总线&#xff08;二&#xff09;通信总线&#xff08;三&#xff09;单/多…

RISC-V特权架构 - 模式切换与委托

RISC-V特权架构 - 模式切换与委托 1 导致模式切换的常见动作2 异常处理规则3 异常处理时模式切换3.1 在U模式下&#xff0c;发生异常3.2 在S模式下&#xff0c;发生异常3.3 在M模式下&#xff0c;发生异常 4 系统调用时模式切换5 中断处理时模式切换 本文属于《 RISC-V指令集基…

PaddleVideo:onnx模型导出

本文节介绍 PP-TSM 模型如何转化为 ONNX 模型&#xff0c;并基于 ONNX 引擎预测。 1&#xff1a;环境准备 安装 Paddle2ONNX python -m pip install paddle2onnx 安装 ONNXRuntime # 建议安装 1.9.0 版本&#xff0c;可根据环境更换版本号 python -m pip install onnxrunti…

CSS:CSS的基础了解

css概述 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09; 是用于控制网页样式和布局的一种样式表语言。用于描述网页的样式和布局&#xff0c;包括字体、颜色、大小、间距、边框等方面。 前端三&#x1f5e1;客&#xff1a;HTML,CSS,JavaScript&am…

GEE:样本点的样式设置

作者:CSDN @ _养乐多_ 本文将介绍在Google Earth Engine (GEE)平台上为样本点设置样式的方法和代码,样本点可以设置成任何颜色,以及7种形状,以便更直观了解数据的分布和特征。 文章目录 一、统一设置样式1.1 示例代码1.2 示例代码链接二、每一类一个样式2.1 示例代码2.2…

jenv实现mac下多版本jdk管理以及切换

文章目录 背景步骤 背景 多个java项目使用jdk版本不一样,mac机器下需要实现多版本的jdk管理. 使用工具jenv 步骤 oracle javase 官网选择合适的jdk版本,比如 我使用jdk11 下载正确的 macOS Arm 64 dmg版本. 然后在mac系统下双击dmg包进行安装. 安装好之后jdk路径为 /Library…

7款公司电脑监控软件

7款公司电脑监控软件 研究证明&#xff0c;人们在家办公的效率比在办公室办公的效率低一半&#xff0c;其中原因是缺少监督&#xff0c;即便在公司办公&#xff0c;还存在员工偷闲的时刻&#xff0c;比如聊天、浏览无关网站、看剧、炒股等&#xff0c;企业想提高员工的工作效率…

【Java】maven传递依赖冲突解决

传递依赖的概念&#xff1a; 传递依赖:&#xff1a; A.jar 依赖 B.jar, B.jar 依赖 C.jar, 这个时候我们就说B是A的直接依赖, C是A传递依赖; 传递依赖可能会产生冲突: 联系着上面, 新导入一个jar包D.jar, D依赖C.jar, 但是B依赖的1.1版本, 而D依赖的是1.2版本, 这时候C这个j…

绝地求生:齐贺PUBG七周年!分享你的游玩感受及反馈赢惊喜道具

PUBG七周年庆典火热进行中&#xff0c;特殊道具、周年主题艾伦格上线&#xff01;七周年期间游玩PUBG&#xff0c;在评论区分享你的游玩感受及反馈&#xff0c;即可参与活动赢取夏日浪潮宝箱奖励。 参与方式 齐贺PUBG七周年&#xff01;在评论区分享分享你的七周年游玩感受及反…

鸿蒙OS实战开发:【多设备自适应服务卡片】

介绍 服务卡片的布局和使用&#xff0c;其中卡片内容显示使用了一次开发&#xff0c;多端部署的能力实现多设备自适应。 用到了卡片扩展模块接口&#xff0c;[ohos.app.form.FormExtensionAbility] 。 卡片信息和状态等相关类型和枚举接口&#xff0c;[ohos.app.form.formInf…

富足--经历和经验先动脑还是动手

当别⼈犯错误&#xff0c;⽽你不犯销误时&#xff0c;你就赢了。 如果我们把⽬光放得⽐较长远&#xff0c;就会发现重视经验和传统的做法会更好。 理性主义的好处是能够找出世界的共性&#xff0c;因此它通常显示出很⾼的效率&#xff0c;特别是短时间内的效率。 最然依赖经…