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

35.LRU 缓存

面试题 16.25. LRU 缓存

设计和构建一个“最近最少使用”缓存,该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。当缓存被填满时,它应该删除最近最少使用的项目。

它应该支持以下操作: 获取数据 get 和 写入数据 put 。

获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。

示例:

LRUCache cache = new LRUCache( 2 /* 缓存容量 */ );cache.put(1, 1);
cache.put(2, 2);
cache.get(1);       // 返回  1
cache.put(3, 3);    // 该操作会使得密钥 2 作废
cache.get(2);       // 返回 -1 (未找到)
cache.put(4, 4);    // 该操作会使得密钥 1 作废
cache.get(1);       // 返回 -1 (未找到)
cache.get(3);       // 返回  3
cache.get(4);       // 返回  4

【算法思路见力扣官方】

好麻烦的题 啊啊啊啊啊啊~~~~~

 1 class LRUCache {
 2     class DLinkNode{
 3         int key;
 4         int value;
 5         DLinkNode pre;
 6         DLinkNode next;
 7         public DLinkNode(){}
 8         public DLinkNode(int _key, int _value){key = _key; value=_value;}
 9     }
10 
11     private Map<Integer,DLinkNode> cache = new HashMap<Integer,DLinkNode>();
12     private int size;      // 当前cache包含的进程数量
13     private int capacity;    // cache 最大容量
14     private DLinkNode head,tail;   // 虚拟头节点和尾节点
15 
16     public LRUCache(int capacity) {
17         this.size=0;
18         this.capacity = capacity;
19         head = new DLinkNode();
20         tail = new DLinkNode();
21         head.next = tail;
22         tail.pre = head;
23     }
24 
25     
26     public int get(int key) {
27         DLinkNode node = cache.get(key);
28         if(node == null) return -1;
29 
30         // 存在 则移动节点到链表头部
31         moveToHead(node);
32         return node.value;
33     }
34     
35     public void put(int key, int value) {
36         DLinkNode node = cache.get(key);
37         // 节点不存在 新建结点
38         if(node == null){
39             DLinkNode newNode = new DLinkNode(key, value);
40             // 存入缓存
41             cache.put(key, newNode);
42             // 移动至头部
43             addToHead(newNode);
44             size++;
45             if(size>capacity){
46                 // 超出容量 找到表尾结点 并删除
47                 DLinkNode tail = removeTail();
48                 cache.remove(tail.key);    //从缓存中删除
49                 size--;
50             }
51         }else{
52                 // 节点存在,更新结点值,移动到头部
53                 node.value = value;
54                 moveToHead(node);
55         }
56     }
57 
58     private void addToHead(DLinkNode node){
59         node.pre = head;
60         node.next = head.next;
61         head.next.pre = node;
62         head.next = node;
63     }
64     private void moveToHead(DLinkNode node){
65         // 先从原有位置删除, 再把node 插入头部
66         removeNode(node);
67         addToHead(node);
68     }
69     // 删除指定结点node
70     private void removeNode(DLinkNode node){
71         node.pre.next = node.next;
72         node.next.pre = node.pre;
73     }
74     // 删除尾结点,并返回尾结点 便于删cache
75     private DLinkNode removeTail(){
76         DLinkNode res = tail.pre;
77         removeNode(res);
78         return res;
79 
80     }    
81 }
View Code

 

http://www.jsqmd.com/news/299112/

相关文章:

  • 初学者使用 docker 快速体验 TDengine 功能
  • 【LeetCode】四数之和 - 指南
  • 我在哪儿-- 照片定位查看助手
  • 2026年企业AI获客必看:GEO服务商选型权威指南
  • LoRA微调target module设置
  • Claude Skills 保姆级教程:无脑照做就能用出效果
  • 人工智能之核心技术 深度学习 第一章 神经网络基础
  • 慢充3.3kW占20%,普通7kW占50%,快充11kW占20%,超充20kW占10
  • 2026年青少年心理辅导优选名单,口碑机构来助力,家庭教育指导/叛逆孩子教育/青少年心理咨询,青少年心理辅导学校排名
  • 完整教程:目前流行的前端框架
  • 电力市场出清程序。 IEEE14节点考虑输电阻塞,求解机组边际电价和节点边际电价。 采用拉格朗...
  • 单北斗GNSS在桥梁和地质灾害变形监测中的应用与发展
  • 【LeetCode】91. 解码方法 - 教程
  • 2026 主流GEO服务商全景图谱,企业GEO服务商选型指南
  • 三相与两相步进方案的矢量控制及超前角控制:内置微控制器的技术解析
  • 光伏储能交直流微电网matlab/simulink仿真,风光储能联合发电系统simulink仿...
  • 双亲表示法构造树-----Java实现
  • KiCad V10新特性前瞻
  • 电气设计的隐藏外挂:1:1元器件图库实战
  • 基于传统材料力学势能法的健康齿轮时变啮合刚度数值分析
  • Product Hunt 每日热榜 | 2026-01-25
  • 构建 OpenHarmony 跨设备任务协同中心:Flutter 实现多端任务流转与状态同步
  • 构建 OpenHarmony 智能场景自动化配置面板:Flutter 实现可视化规则编排
  • Simulink双Y-30度六相感应电机模型,matlab18B版本。 六相交流供电
  • 强烈安利8个一键生成论文工具,继续教育学生论文写作必备!
  • ubuntu_server安装教程
  • 基于深度学习的 pcb 缺陷检测系统
  • 基于单片机的汽车倒车雷达超声波测距系统设计
  • 2025年市面上热门的自动化立体库制造企业怎么选,轻型货架/隔板货架/仓储货架/中型货架,自动化立体库供应厂家哪家强
  • JWT 解码工具