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

146. LRU 缓存

一、题目在这里插入图片描述

二、思路

  • 题目要求 O(1) 的平均时间复杂度运行 -> 使用Map空间换时间 Map<Integer, Node>
  • Map 通过 key 直接找到对应节点 getNode(key) -> Node
  • 记得只要查过该节点之后就应该把该节点放到最前面 pushFront(Node)
  • put 元素后,在map中添加,记得检查是否超过 capacity,超过则删除在map中的元素,以及在链表中的元素 delete(Node)
  • 这里提到的 pushFront(Node) 和 delete(Node) 都是针对双向队列进行位置移动相关的操作,不涉及 Map。

三、代码

class LRUCache {class Node{int key,val;Node pre, next;Node(int key, int val) {this.key = key;this.val = val;}}Node dummy = new Node(0, 0);int capacity;Map<Integer, Node> map = new HashMap<>();// 初始化双向队列public LRUCache(int capacity) {dummy.pre = dummy;dummy.next = dummy;this.capacity = capacity;}public int get(int key) {// 从 map 中快速获得 nodeNode node = map.get(key);// 不存在返回 -1if (node == null) {return -1;}// 查询到需要遵循LRU的规则将最近查询的放到队首delete(node);pushFront(node);return node.val;}public void put(int key, int value) {Node node = map.get(key);// 已经存在就直接进行更新值,结束 put 方法if (node != null) {// 更新值node.val = value;delete(node);pushFront(node);return ;}// 不存在就新建一个 node,在双向队列和 map 中同时更新node = new Node(key,value);pushFront(node);map.put(key, node);// 更新后检查是否超出容量// 超出容量就删除双向队列中的最后一个节点,同时在 map 中删除if (map.size() > capacity) {Node lastNode = dummy.pre;delete(lastNode);map.remove(lastNode.key);}}// 将 node 放到双向队列队首private void pushFront(Node node) {node.next = dummy.next;node.pre = dummy;dummy.next.pre = node;dummy.next = node;}// 在双向队列中删除 nodeprivate void delete(Node node) {node.pre.next = node.next;node.next.pre = node.pre;}
}/*** 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/7203.html

相关文章:

  • 自己拥有一台服务器可以做哪些事情
  • 科技行业智能化升级经典案例—某芯片公司
  • Perl测试管理:从混乱到高效的系统化实践
  • 《DiffPoint训练过程详解:从图像到点云的逐步优化》
  • B树与B+树全面解析
  • Vue3.5 企业级管理系统实战(十九):菜单管理
  • 开发 前端搭建npm v11.4.0 is known not to run on Node.js v14.18.1.
  • Ansible模块——主机名设置和用户/用户组管理
  • 02-前端Web开发(JS+Vue+Ajax)
  • 用Python实现数据库数据自动化导出PDF报告:从MySQL到个性化文档的全流程实践
  • 【工具使用】STM32CubeMX-片内Flash读写操作
  • DTAS 3D多约束装配助力悬架公差分析尺寸链计算:麦弗逊/双叉臂/多连杆/H臂一网打尽
  • 软件设计师“开发过程模型:瀑布、增量、原型、螺旋、喷泉、基于构件的开发模型、形式化方法模型、统一过程RUP、敏捷、极限”真题考点分析——求三连
  • 从虚拟仿真到行业实训再到具身智能--华清远见嵌入式物联网人工智能全链路教学方案
  • 纯前端实现图文识别 OCR
  • paddle ocr本地化部署进行文字识别
  • 从编程助手到AI工程师:Trae插件Builder模式实战Excel合并工具开发
  • 解决 MySQL 错误 1356 (HY000)
  • WPF技巧-BindingProxy
  • 基于局部显著位置感知的异常掩码合成方法在CT图像肺部疾病异常检测与病变定位中的应用|文献速递-深度学习医疗AI最新文献
  • iOS:重新定义移动交互,引领智能生活新潮流
  • 《算法导论(第4版)》阅读笔记:p86-p90
  • LabVIEW数据库使用说明
  • std::ranges::iota
  • ArcGIS Pro 3.4 二次开发 - 内容
  • DDoS与CC攻击:谁才是服务器的终极威胁?
  • 免费开放试乘体验!苏州金龙自动驾驶巴士即将上线阳澄数谷
  • 1.1 结构体与类对象在List中使用区别
  • C++23 std::mdspan:多维数组处理新利器
  • 如何用Python批量解压ZIP文件?快速解决方案