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

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);*/

相关文章:

  • C++字符串处理:`std::string`和`std::string_view`的区别与使用
  • R 语言科研绘图第 49 期 --- 热力图-相关性
  • Geotools中关于坐标转换纬度超限问题
  • vue2、vue3项目打包生成txt文件-自动记录打包日期:git版本、当前分支、提交人姓名、提交日期、提交描述等信息 和 前端项目的版本号json文件
  • 物联网数据湖架构
  • 【C++】异常解析
  • YouTube视频字幕转成文章算重复内容吗?
  • 五分钟完成PolarDB替换postgresql
  • paddle ocr本地化部署进行文字识别
  • 基于Elasticsearch的搜索引擎简介
  • 为 Windows 和 Ubuntu 中设定代理服务器的详细方法
  • 区块链blog2_中心化与效率
  • 解决软件连接RabbitMQ突发System.IO.IOException: 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接异常
  • VR 互动实训的显著优势​
  • 一文了解VR拍摄制作
  • 江协科技EXTI外部中断hal库实现
  • HarmonyOS开发样式布局
  • Ubuntu ping网络没有问题,但是浏览器无法访问到网络
  • 从零开始训练一个CLIP
  • Tare使用MCP|Win11安装UV
  • 减重人生|吃得越少越好?比体重秤上的数字,更有意义的是什么?
  • 江苏省人民检察院副检察长丁海涛调任省委政法委副书记
  • 台陆委会将欧阳娜娜等20多名艺人列入重要查核对象,国台办回应
  • 巴基斯坦外长访华是否与印巴局势有关?外交部:此访体现巴方高度重视中巴关系
  • 学生靠老干妈下饭、职工餐肉类又多又好?纪委出手整治
  • 1至4月国家铁路发送货物12.99亿吨,同比增长3.6%