【leetcode hot 100 146】LRU缓存

ops/2025/3/17 18:02:39/

解法一:(哈希表 + 双向链表)LRU 缓存机制可以通过哈希表辅以双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对。

  • 双向链表按照被使用的顺序存储了这些键值对,靠近头部的键值对是最近使用的,而靠近尾部的键值对是最久未使用的。
  • 哈希表即为普通的哈希映射(HashMap),通过缓存数据的键映射到其在双向链表中的位置。
class LRUCache {class DLinkNode{int key;int value;DLinkNode prev;DLinkNode next;// 记得写构造函数public DLinkNode(){}public DLinkNode(int key, int value){this.key=key; this.value=value;}}private Map<Integer,DLinkNode> mapID = new HashMap<>();private int capacity;private int size;private DLinkNode head,tail;  // 全部放到构造函数去初始化public LRUCache(int capacity) {this.capacity = capacity;this.size = 0;head = new DLinkNode();tail = new DLinkNode();head.next = tail;tail.prev = head;}public int get(int key) {DLinkNode node = mapID.get(key);if(node==null){return -1;}// 将node放到双链表头部,表示刚刚访问过moveToHead(node);return node.value;}public void put(int key, int value) {DLinkNode node = mapID.get(key);if(node==null){// 不存在:申请node,放在头部,超过数量就删除尾部DLinkNode newNode = new DLinkNode(key, value);addNode(newNode);mapID.put(key,newNode); // mapID也要做相应的put和removesize++;if(size>capacity){DLinkNode tail = deleteTail();// mapID.remove(key)不可,要返回删除的key,以此为准来一移除mapID.remove(tail.key);size--;}}else{// 已经存在:修改v值,移到最前面node.value = value;moveToHead(node);}}private void moveToHead(DLinkNode node){removeNode(node);addNode(node);}private DLinkNode removeNode(DLinkNode node){node.prev.next = node.next;node.next.prev = node.prev;return node;}private void addNode(DLinkNode node){node.next = head.next;head.next = node;node.prev = head;node.next.prev = node;}private DLinkNode deleteTail(){DLinkNode res = removeNode(tail.prev);return res;}
}/*** Your LRUCache object will be instantiated and called as such:* LRUCache obj = new LRUCache(capacity);* int param_1 = obj.get(key);* obj.put(key,value);*/

注意:

  • 参数的初始化全部放到构造函数去初始化
  • 双链表进行添加和移除时候,mapID也要做相应的putremove
  • mapID进行移除时,mapID.remove(key)不可,要返回删除的key,以此为准来一移除

http://www.ppmy.cn/ops/166578.html

相关文章

时间序列预测(十九)——卷积神经网络(CNN)在时间序列中的应用

有关CNN的介绍可以参考以下博文&#xff1a; 卷积神经网络&#xff08;CNN&#xff09;详细介绍及其原理详解-CSDN博客 三万字硬核详解&#xff1a;卷积神经网络CNN&#xff08;原理详解 项目实战 经验分享&#xff09;_cnn卷积神经网络-CSDN博客 CNN笔记&#xff1a;通俗…

[C#] 对24位图像进行水平翻转(FlipX)的跨平台SIMD硬件加速向量算法-第2部分:使用YShuffleX2Kernel优化程序

文章目录 一、算法思路1.1 瓶颈分析1.2 优化思路1.3 计算索引 二、算法实现2.1 程序里计算索引2.2 思路A的实现2.3 思路B的实现 三、基准测试结果3.1 X86 架构3.1.1 X86 架构上.NET 6.0程序的测试结果3.1.2 X86 架构上.NET 7.0程序的测试结果3.1.3 X86 架构上.NET 8.0程序的测试…

kotlin中jetpack组件(目录总结)

架构组件 用于帮助开发者设计稳健、可测试且易于维护的应用架构。 ViewModel&#xff1a;负责管理与 UI 相关的数据&#xff0c;在配置更改&#xff08;如屏幕旋转&#xff09;时保持数据的一致性。它将 UI 逻辑和业务逻辑分离&#xff0c;使代码更易于维护和测试。例如&#…

Spring boot+mybatis的批量删除

我们还是现在controller里面写正常的语句 我们先传一个ids&#xff0c;然后变成json&#xff0c;加入RequestBody这个注解 这样我们就实现了controller的撰写&#xff0c;接着我们写service&#xff0c;我们要理解一个过程哈&#xff0c;首先我们从前端传过来值&#xff0c;然…

【从零开始学习计算机科学】设计模式(一)设计模式概述

【从零开始学习计算机科学】设计模式(一)设计模式概述 设计模式简介设计模式与软件架构设计模式的分类1. 创建型模式(Creational Patterns)2. 结构型模式(Structural Patterns)3. 行为型模式(Behavioral Patterns)4. J2EE模式(J2EE Patterns)设计模式的实际应用设计模…

day04_Java高级

文章目录 day04_Java高级一、今日课程内容二、可变参数三、Java的集合1、单列集合1.1 List集合1.2 常见的数据结构(了解)1.3 Set集合1.4 哈希表 2、双列集合3、Collections集合工具类 四、&#xff08;掌握&#xff09;Lambda表达式1、体验Lambda表达式2、Lambda表达式的标准格…

unittest vs pytest区别

unittest vs pytest 对比 ​unittest 像“手动挡汽车”&#xff1a;操作步骤多&#xff0c;规则严格&#xff0c;适合老司机。​pytest 像“自动挡汽车”&#xff1a;开起来轻松&#xff0c;功能强大&#xff0c;适合新手和高效开发。 区别点​unittest​&#xff08;你学过的&…

python爬虫Scrapy(5)之CrawlSpider

CrawlSpider 实现网站的全站数据爬取 就是将网站中所有页码对应的页面数据进行爬取。 crawlspider其实就是scrapy封装好的一个爬虫类&#xff0c;通过该类提供的相关的方法和属性就可以实现全新高效形式的全站数据爬取。 使用流程&#xff1a; 新建一个scrapy项目 cd 项目 …