首页/新闻资讯/正文详情

元宝 LeetCode 146. LRU 缓存 Java实现

发布时间:2026/9/24 17:45:23 来源:云帆数科 栏目:资讯中心
元宝    LeetCode 146. LRU 缓存 Java实现
LeetCode 146 LRU 缓存是一道非常经典的数据结构设计题。要求“get” 和“put” 操作都在 O(1) 时间复杂度内完成。实现 O(1) 时间复杂度的核心思路是哈希表HashMap 双向链表。HashMap用于通过“key” 快速定位到链表中的节点O(1) 查找。双向链表用于维护数据的“最近使用”顺序。头部是最近使用的尾部是最久未使用的。下面提供两种 Java 实现方式。方法一手写双向链表 HashMap面试标准解法这种方式完全手动维护双向链表展示了底层原理是面试中的标准答案。思路定义双向链表节点包含“key”,“value”,“prev”,“next”。初始化设置伪头部dummy head和伪尾部dummy tail简化边界条件处理。get(key)如果 key 不存在返回 -1。如果存在通过哈希表找到节点将该节点移动到链表头部表示最近使用然后返回 value。put(key, value)如果 key 已存在更新 value并将节点移动到头部。如果 key 不存在创建新节点加入链表头部和哈希表。如果容量超限删除链表尾部节点最久未使用并从哈希表中移除对应的 key。Java 代码实现import java.util.HashMap;import java.util.Map;class LRUCache {// 1. 定义双向链表节点 class DLinkedNode { int key; int value; DLinkedNode prev; DLinkedNode next; public DLinkedNode() {} public DLinkedNode(int key, int value) { this.key key; this.value value; } } private MapInteger, DLinkedNode cache new HashMap(); private int size; private int capacity; private DLinkedNode head; // 伪头部最近使用的端 private DLinkedNode tail; // 伪尾部最久未使用的端 // 2. 初始化 public LRUCache(int capacity) { this.size 0; this.capacity capacity; head new DLinkedNode(); tail new DLinkedNode(); head.next tail; tail.prev head; } // 3. get 操作 public int get(int key) { DLinkedNode node cache.get(key); if (node null) { return -1; } // 将访问的节点移动到头部 moveToHead(node); return node.value; } // 4. put 操作 public void put(int key, int value) { DLinkedNode node cache.get(key); if (node ! null) { // key 存在更新值并移到头部 node.value value; moveToHead(node); } else { // key 不存在创建新节点 DLinkedNode newNode new DLinkedNode(key, value); cache.put(key, newNode); addToHead(newNode); size; // 如果超出容量删除尾部节点 if (size capacity) { DLinkedNode removedNode removeTail(); cache.remove(removedNode.key); size--; } } } // 5. 辅助方法在头部添加节点 private void addToHead(DLinkedNode node) { node.prev head; node.next head.next; head.next.prev node; head.next node; } // 6. 辅助方法移除节点 private void removeNode(DLinkedNode node) { node.prev.next node.next; node.next.prev node.prev; } // 7. 辅助方法将节点移动到头部 private void moveToHead(DLinkedNode node) { removeNode(node); addToHead(node); } // 8. 辅助方法删除尾部节点并返回 private DLinkedNode removeTail() { DLinkedNode node tail.prev; removeNode(node); return node; }}方法二继承 LinkedHashMap工程/偷懒写法Java 标准库中的“LinkedHashMap” 本身就维护了一个按访问顺序accessOrder排列的双向链表。通过重写“removeEldestEntry” 方法可以非常简洁地实现 LRU 缓存。注意面试时通常要求手写方法一但在实际项目或竞赛中这种写法既优雅又不易出错。import java.util.LinkedHashMap;import java.util.Map;class LRUCache extends LinkedHashMapInteger, Integer {private int capacity;public LRUCache(int capacity) { // 参数初始容量负载因子accessOrdertrue 表示按访问顺序排序 super(capacity, 0.75f, true); this.capacity capacity; } public int get(int key) { // 如果找不到返回 -1 return super.getOrDefault(key, -1); } public void put(int key, int value) { super.put(key, value); } // 当插入新元素且 size capacity 时LinkedHashMap 会自动调用此方法 // 返回 true 则会删除最久未使用的元素即链表头部的元素 Override protected boolean removeEldestEntry(Map.EntryInteger, Integer eldest) { return size() capacity; }}复杂度分析时间复杂度“get” 和“put” 操作均为 O(1)。哈希表的增删改查是 O(1)双向链表的节点移动和删除也是 O(1)。空间复杂度O(capacity)哈希表和双向链表最多存储“capacity 1” 个元素。如果你对双向链表的指针操作或“LinkedHashMap” 的底层机制有疑问我可以单独为你拆解讲解

相关推荐

Django入门教程(二十七):博客项目实战(八)——表单处理与收藏功能
Django入门教程(二十七):博客项目实战(八)——表单处理与收藏功能

一、收藏功能的数据模型设计 收藏功能的核心是:一个用户可以收藏多篇文章,一篇文章可以被多个用户收藏。这是典型的多对多(ManyToMany)关系。 我们不需要新建模型——Django 的 User 模型是内置的,只需要在 Post 模型中添加一个 ManyToManyField 指向 User。 python # 文… · 2026/9/24 17:45:23

Django入门教程(二十五):博客项目实战(六)——分类筛选与关键词搜索
Django入门教程(二十五):博客项目实战(六)——分类筛选与关键词搜索

一、URL 查询参数 查询参数是 URL 中问号后面的部分,如 /?category=django&q=入门。 在 Django 视图函数中,通过 request.GET 获取这些参数。 python def index(request):# request.GET 是一个类似字典的对象# .get(key, 默认值) 安全获取参数,不存在时返回默认值cat… · 2026/9/24 17:45:23

MySQL数据库命令
MySQL数据库命令

目录 m结束符 库 1、创建数据库 2、查看数据库 3、选择,进入数据库 4、修改数据库 5、删除数据库 表 一、数据类型 1、数值类型 2、日期时间型 3、字符串类型 二、表的创建 1、表结构的设计 2、创建表 3、查看表 4、表修改 1、修改表名 2、修改字… · 2026/9/24 17:45:17

实拍交通标志数据集550张:txt/xml双格式,跑通yolov8训练
实拍交通标志数据集550张:txt/xml双格式,跑通yolov8训练

简介:这是一份面向深度学习目标检测方向的实拍交通标志数据集,适合正在做交通标志识别项目、准备YOLO系列算法训练或课程设计的学生与算法工程师使用。数据集共包含550张实拍图像,覆盖停止、提示、等待三类标志,并已同步提供txt与… · 2026/9/24 18:14:30

YOLOv5+RealSense D455单目测距实战:从检测框到毫米级深度值的精准映射
YOLOv5+RealSense D455单目测距实战:从检测框到毫米级深度值的精准映射

简介:本资源是一套基于YOLOv5-3.1与Intel RealSense D455深度相机实现的单目测距系统完整源码,面向计算机视觉初学者、嵌入式AI开发者及智能感知项目实践者,解决目标检测与距离估算融合落地的关键问题,适用于机器人避障、工业定位… · 2026/9/24 18:14:18

无人机目标检测数据集与YOLO训练教程:5000张标注图片+划分脚本实战
无人机目标检测数据集与YOLO训练教程:5000张标注图片+划分脚本实战

简介:一套面向无人机视觉应用的目标检测数据集,包含5000张真实场景高清图像,覆盖多种飞行环境与目标形态。数据使用LabelImg标注,标签质量较高,并同时提供VOC(xml)、COCO(json&#… · 2026/9/24 18:14:18

YOLOv8+DeepSORT施工安全检测跟踪实战:从数据集训练到部署避坑指南
YOLOv8+DeepSORT施工安全检测跟踪实战:从数据集训练到部署避坑指南

简介:一套面向施工场景的安全隐患检测与跟踪解决方案,基于YOLOv8与DeepSORT算法,帮助工程管理人员自动识别工人是否佩戴安全帽、穿着反光背心等,并实现持续跟踪预警。资源核心包含1206张已标注图像的目标检测数据集,同… · 2026/9/24 18:14:18

小米8青春版刷安卓11:zip包拆包、备份与刷机全流程解析
小米8青春版刷安卓11:zip包拆包、备份与刷机全流程解析

简介:针对小米8青春版适配Android 11(LineageOS 18.1)的第三方固件包,面向想升级系统、体验新特性的刷机爱好者。压缩包共13个文件,体积798.3MB,包含系统与vendor分区镜像、增量补丁、分区列表、boot引导镜… · 2026/9/24 18:14:18

你的论文“AI味”为什么洗不掉?不是词换得不够多,是节奏被摸透了
你的论文“AI味”为什么洗不掉?不是词换得不够多,是节奏被摸透了

aigcbiye官网 微信公众号搜一搜 aigcbiye 你有没有遇到过这种事:明明自己逐句写的段落,提交检测之后却被标了一堆红。你怀疑检测系统疯了,但系统没疯。它不是在找你抄了谁,也不是在判断“这到底是不是AI写的”——它在干一件更隐… · 2026/9/24 18:14:18

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码