当前位置: 首页 > news >正文

2025年- H42-Lc150 --146. LRU缓存(哈希表,双链表)需二刷--Java版

1.题目描述

在这里插入图片描述

2.思路

LRU(最近最少使用):如果缓存的容量为2,刚开始的两个元素都入栈。之后该2元素中有其中一个元素(重点元素)被访问。把最近访问过的重点元素保留,另一个边缘元素就得离开缓存了。

下面是leetcode思路:
在这里插入图片描述
总结:
(1)创建一个哈希表和双向链表。链表头部是最近刚使用过的元素,尾部是最近不经常使用的元素。
(2)put(),首先如果新加入的元素在哈希表中不存在,则直接创建新节点加入到map中。如果双向链表的节点数超过链表容量,则剔除尾部节点(包括它的值)。如果新加入的元素存在(key存在),我们通过get进行定位,把节点值进行更新,移动到头部(说明是最近刚被访问的)
(3)get(),如果get(key)不存在直接返回-1,如果key存在,说明key节点是最近被使用的节点。通过哈希表定位到双向链表的位置,并将其移动到双向链表的头部,返回该节点的值。
在这里插入图片描述

3.代码实现

class LRUCache {class doubleLinkedNode{int key;int value;doubleLinkedNode prev;doubleLinkedNode next;public doubleLinkedNode() {}public doubleLinkedNode(int key, int value) {this.key = key;this.value = value;}}private Map<Integer,doubleLinkedNode> cache=new HashMap<Integer,doubleLinkedNode>();private int size;private int capacity;private doubleLinkedNode head;private doubleLinkedNode tail;public LRUCache(int capacity) {this.size=0;this.capacity=capacity;//使用伪头部和伪尾部节点head=new doubleLinkedNode();tail=new doubleLinkedNode();head.next=tail;tail.prev=head;}public int get(int key) {doubleLinkedNode node=cache.get(key);if(node==null){return -1;}//如果key存在,通过哈希表定位,再移动到头部moveToHead(node);return node.value;}public void put(int key, int value) {doubleLinkedNode node=cache.get(key);if(node==null){//2.如果key不存在,则创建一个新的节点doubleLinkedNode newNode=new doubleLinkedNode(key,value);//添加到哈希表cache.put(key,newNode);//添加到双向链表的头部addToHead(newNode);size++;// 如果添加的数量超出容量if(size>capacity){//超出容量,说明要删除双向链表的尾部节点doubleLinkedNode tail=removeTail();//删除哈希表中对应的项,删尾部节点对应的key值cache.remove(tail.key);size--;}}else{//如果key存在,先通过哈希表定位,再修改value,并移动到头部node.value=value;moveToHead(node);}}private void addToHead(doubleLinkedNode node){node.prev=head;node.next=head.next;head.next.prev=node;head.next=node;}private void removeNode(doubleLinkedNode node){node.prev.next=node.next;node.next.prev=node.prev;}private void moveToHead(doubleLinkedNode node){removeNode(node);addToHead(node);}private doubleLinkedNode removeTail(){doubleLinkedNode res=tail.prev;removeNode(res);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);*/
http://www.xdnf.cn/news/582283.html

相关文章:

  • 先更新数据库,再删除缓存的cache aside策略
  • 6.DevOps体系之Jenkins
  • 深入掌握Node.js HTTP模块:从开始到放弃
  • JS实现直接下载PDF文件
  • 动手学深度学习12.6. 多GPU的简洁实现-笔记练习(PyTorch)
  • OpenCV图像平移示例
  • Linux笔记---信号(下)
  • RabbitMQ可靠传输——持久性、发送方确认
  • LangFlow可视化Agent编排
  • 监控易代理合作“自助餐”模式上线:战略/OEM/集成,总有一款适合你
  • 【视频】使用海康SDK保存的MP4无法在浏览器(html5)中播放
  • VPLC (VPLCnext) K8S
  • (1)深度学习基础知识(八股)——常用名词解释
  • # 深入解析BERT自然语言处理框架:原理、结构与应用
  • SSL/TLS证书申请与管理技术指南
  • 【QT】QT6设置.exe文件图标
  • 华为2025年校招笔试手撕真题教程(二)
  • C++ 日志系统实战第五步:日志器的设计
  • 搜维尔科技VR+5G教室建设方案,推动实现教育数字化转型
  • 5G基站选择±10ppm晶振及低相噪技术解析
  • 云原生微服务的前世今生
  • 5G 网络寻呼的信令及 IE 信息分析
  • paddlehub搭建ocr服务
  • 关于vue彻底删除node_modules文件夹
  • JMeter-Websocket接口自动化
  • Python 学习笔记
  • React19 项目开发中antd组件库版本兼容问题解决方案。
  • ubuntu中上传项目至GitHub仓库教程
  • 【数据结构与算法】LeetCode 每日三题
  • LeetCode 3356.零数组变换 II:二分查找 + I的差分数组