力扣 146. LRU 缓存

news2025/1/15 23:27:28

题目

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。
函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

示例

输入
[“LRUCache”, “put”, “put”, “get”, “put”, “get”, “put”, “get”, “get”, “get”]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -1, 3, 4]

解释
LRUCache lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1); // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
lRUCache.get(2); // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}
lRUCache.get(1); // 返回 -1 (未找到)
lRUCache.get(3); // 返回 3
lRUCache.get(4); // 返回 4

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/lru-cache
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法1:哈希链表

  • 如果每次默认从链表尾部添加元素,那么显然越靠尾部的元素就是最近使用的,越靠头部的元素就是最久未使用的。
  • 对于某一个 key,可以通过哈希表快速定位到链表中的节点,从而取得对应 val。
  • 链表显然是支持在任意位置快速插入和删除的,改改指针就行。只不过传统的链表无法按照索引快速访问某一个位置的元素,而这里借助哈希表,可以通过哈希表key 快速映射到任意一个链表节点,然后进行插入和删除。
Java实现
class LRUCache {
    int capacity;
    LinkedHashMap<Integer, Integer> cache = new LinkedHashMap<>();
    public LRUCache(int capacity) {
        this.capacity = capacity;
    }
    
    public int get(int key) {
        if (!cache.containsKey(key)) return -1;
        makeRecently(key);
        return cache.get(key);
    }
    
    public void put(int key, int value) {
        if (cache.containsKey(key)) {
            cache.put(key, value);
            makeRecently(key);
            return;
        }

        if (cache.size() >= capacity) {
            int oldestKey = cache.keySet().iterator().next();
            cache.remove(oldestKey);
        }
        cache.put(key, value);
    }

    private void makeRecently(int key) {
        int val = cache.get(key);
        cache.remove(key);
        cache.put(key, val);
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于PHP+MySQL二手书交易系统

随着时代的变迁和人们的对知识的汲取,人们需要不断的购买一些新的图书来进行学习,但是这些图书在使用过一点时间之后其价值也会在拥有者手中变的没有那么高了,但是对于没有阅读和使用过这本书的人来说其还是具有更好的价值的,如果直接购买新书价格比较昂贵,对于拥有者来说如果将…

6个好用到爆的音频、配乐素材网站,BGM都在这里了

现在只要有一部手机&#xff0c;人人都能成为视频创作者。一个好的视频不能缺少的就是内容、配乐&#xff0c;越来越注重版权的当下&#xff0c;音效素材使用不当造成侵权的案例层出不穷。为了避免侵权&#xff0c;找素材让很多创作者很头疼。 今天我就整理了6个可以免费下载&a…

Hibernate多表的关联插入

一、一对多关系&#xff1a; “一”的一方为主表&#xff0c;“多”的一方为副表&#xff0c;主表关联副表&#xff0c;应该在主表中加入副表对象作为属性。 根据顾客ID查询顾客信息 &#xff08;一&#xff09; &#xff0c;同时将顾客名下所有订单查出 &#xff08;多&#…

公司建设网站的好处及优势

企业为什么要建网站&#xff1f;企业建站的好处和优势&#xff01;在新的世纪里&#xff0c;互联网将进入一个全新的阶段&#xff0c;信息技术的发展将带动其他行业的发展&#xff0c;所有行业都将与之深度融合和渗透。 越来越多的企业开始从对互联网的认识阶段走向认同和行动…

在关系数据库中允许空值的一些缺点

早在 2020 年&#xff0c;我们就了解了关系数据库系统中的 NULL 值及其用途。正如那篇文章所述&#xff0c;NULL 值已成为一个特殊标记&#xff0c;表示不存在任何数值。你也可以说 NULL 值可能表示列可能有一个值&#xff0c;但是你还不知道该值是什么。在这种情况下&#xff…

Python: 打包发布到PyPi上

经常会碰到python包要打包成sdk放到PyPi上开源的情况。 下面的操作具体参考&#xff1a;https://packaging.python.org/en/latest/tutorials/packaging-projects/。 一、准备 1、pyproject.toml 我的具体如下 [build-system] requires ["setuptools>61.0"] bu…

atguigu8 集群

0. 集群介绍 &#xff08;1&#xff09;集群的目标 • 高可用&#xff08;High Availability&#xff09;&#xff0c;是当一台服务器停止服务后&#xff0c;对于业务及用户毫无影 响。 停止服务的原因可能由于网卡、路由器、机房、CPU负载过高、内存溢出、自 然灾害等不可预…

基于Matlab使用线性FM波形对带状合成孔径雷达系统建模(附源码)

目录 一、合成孔径雷达成像 二、雷达配置 三、场景配置 四、SAR 信号模拟 五、总结 六、程序 此示例说明如何使用线性 FM &#xff08;LFM&#xff09; 波形对基于带状图的合成孔径雷达 &#xff08;SAR&#xff09; 系统进行建模。SAR是一种侧视机载雷达&#xff0c;与真实…

布隆过滤器原理,优缺点

介绍&#xff1a; 位图&#xff1a;int[10]&#xff0c;每个int类型的整数是4*832个bit&#xff0c;则int[10]⼀共有320 bit&#xff0c;每个bit⾮0即1&#xff0c;初始化时都是0 添加数据时&#xff1a;将数据进⾏hash得到hash值&#xff0c;对应到bit位&#xff0c;将该bit改…

Koa.js搭建简单服务器,连接数据库

Koa.js搭建简单服务器&#xff0c;连接数据库1. 环境node v7.6版本以上2. 创建服务安装依赖3. 根目录新建index.js&#xff0c;新建router.js&#xff0c;controller文件夹4. 浏览器访问5. 连接mysql6. 查询测试7、其它1. 环境node v7.6版本以上 2. 创建服务安装依赖 新建文件…

Origin绘制折线图

Origin常用功能见&#xff1a; Origin常用功能_Dezeming的博客-CSDN博客Origin支持各种各样的2D/3D图形。Origin中的数据分析功能包括统计&#xff0c;​信号处理&#xff0c;曲线拟合以及峰值分析。Origin中的曲线拟合是采用基于Levernberg-Marquardt算法&#xff08;LMA&…

软件设计模式复习

一、统一建模语言 1.统一建模语言知识点 二、面向对象设计原则 史上最全设计模式导学目录&#xff08;完整版&#xff09; 三、设计模式概述 1.定义&#xff1a;设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代…

Go 语言报错 StackGuardMultiplier redeclared in this block

前言 最近在 GitHub 刷到了 GitHub - golang-china/gopl-zh: Go语言圣经中文版&#xff0c; 然后又是周末&#xff0c;就起了玩心。搞一个 Go 玩玩&#xff0c;去 The Go Programming Language下载了 Go 语言安装包&#xff0c;一路默认安装。然后打开 VS Code 安装 Extensio…

5个编写技巧,有效提高单元测试实践

1. 什么是单元测试 “在计算机编程中&#xff0c;单元测试又称为模块测试&#xff0c;是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中&#xff0c;一个单元就是单个程序、函数、过程等&#xff1b;对于面向对象编程&#xff0c;最…

PPT的使用技巧(一):对齐、文字填充、柱状图填充

1、快速对齐 在制作PPT时&#xff0c;需要将绘制的几个图形进行对齐&#xff0c;如果用人工进行对齐&#xff0c;则效果会很差&#xff0c;且耗时严重。如下图所示为未对齐时的情况&#xff0c;可以发现4个矩形在水平、垂直方向均不对其。 我们需要将其进行对齐后变成如下效果…

1. Windows 安装 elasticsearch-8.5.1 和 kibana

1. 准备下载文件 Elasticsearch 下载地址&#xff1a; https://www.elastic.co/downloads/elasticsearch Kibana 下载地址&#xff1a; https://www.elastic.co/downloads/kibana 2.启动es 1、配置文件&#xff1a;注意ip用个人ip别用localhost # Elasticsearch Configur…

面板数据熵值法计算综合指数Stata代码(附样本数据和结果)

面板数据熵值法计算综合指数Stata代码&#xff08;附样本数据和结果&#xff09; 熵值法是指用来判断某个指标的离散程度的数学方法。离散程度越大&#xff0c;该指标对综合评价的影响越大。可以用熵值判断某个指标的离散程度。 在信息论中&#xff0c;熵是对不确定性的一种度…

jasperreports6.12.2 could not load the following font解决方法

jasperreports通过Java代码生成PDF的时候不能获取中文字体&#xff0c;报错提示如下&#xff1a; net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font: pdfFontName: STSong-Light pdfEncoding: Identity-H isPdfEmbedded : true本次环境&…

聊一聊华为云弹性公网IP的那些事儿

聊一聊华为云弹性公网IP的那些事儿 如今&#xff0c;企业上云已成为热门话题&#xff0c;云可以驱动流程创新和业务创新&#xff0c;成为企业新的利润增长点&#xff0c;被看成是企业实现数字化转型的必经之路。弹性公网IP作为一种网络基础能力&#xff0c;也是华为云客户日常…

【Linux】多线程基础

文章目录1.线程的基本概念1.1重定义进程1.2Linux下的线程2.多级页表3.线程VS进程3.1线程的优缺点3.2线程异常3.3线程用途3.4线程与进程的关系4.线程控制4.1线程创建4.2线程等待4.3进程终止4.4线程分离5.线程ID与线程结构1.线程的基本概念 在一个程序里的一个执行路线就叫做线程…