【力扣每日一题】2023.9.24 LRU缓存

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

这又是一道程序设计类的题目,要我们实现LRU缓存的get和put操作。

简单说一下LRU缓存是什么,在我看来就是实用主义的体现。

比如说现在需要对一些工具进行排序,如果我用了一下锤子,那么我就拿出锤子,用完之后我就把这个锤子放在了所有工具的最前面。

如果我用了一下锄头,但是工具里没有锄头,那么我从别的地方搞来锄头之后我就放在所有工具的最前面,如果工具数量超过最大限制了,那么就把最尾巴的工具扔掉。

也就是我最近使用的就排在前面,很久不用的就排在后面,直到超过容量,把最久不用的移出缓存。

get操作就需要我们找出缓存中是否有目标的键值对,如果有,那么我们需要将这个键值对移到缓存的最开头。如果没有,那么我们直接返回-1。

put操作也需要我们找出缓存中是否有目标的键值对,如果有,那么我们更新这个键的值并且移动到缓存的最开头。如果没有,我们就添加这个键值对到缓存的开头,并且如果缓存的大小超过了限制大小,我们就把缓存的最末尾给丢掉。

这个模拟起来其实不难,难点在于常规模拟会超时,因为题目要求我们使用O(1)的平均时间复杂度,也就是我们无法遍历缓存来实现模拟操作。

我们还需要记录缓存中的先后顺序,并且有时需要改变先后顺序,因此我们应该使用链表来记录缓存。

如果我们要从容器中找出一个元素但是不能通过遍历的方式去,那么比较容易想到的就是set或是map。

所以我们本题中选择链表(list)和map来做本题,通过链表来记录LRU缓存中数据的先后顺序,使用map来查找目标键来定位到链表中对应的键值对。

使用map来将键以及对应键值对在链表中的迭代器指针进行绑定,这样即可以定位到缓存中的目标,使用迭代器也方便删除链表中的节点。

在get中,如果找不到对应键就返回-1,反之就把对应的键值对从链表中删除,再添加回链表开头,并且需要更新map中的记录。

在put中,无论找不找得到键,我们都需要把新的键值对添加到链表的开头。如果找得到键,那么我们直接把键在链表中的老地方给移除。如果找不到,我们就需要判断一下缓存的大小,如果超过大小限制,我们就需要把链表的尾部给移除。

代码:

class LRUCache {
public://存放键值list<pair<int,int>>l;//存放键所在地方的迭代器unordered_map<int,list<pair<int,int>>::iterator>m;//缓存大小int cap;LRUCache(int capacity):cap(capacity){ }int get(int key) {if(m.find(key)==m.end()) return -1;auto target=*m[key];        //获取目标的键值对l.erase(m[key]);            //在链表中删除目标l.push_front(target);       //在开头重新添加回去//错误示范// auto target=m[key];      //获取目标的迭代器// l.erase(target);         //这边删除之后,迭代器所指位置不变,所指元素发生改变// l.push_front(*target);   //添加回去的是未知元素m[key]=l.begin();           //修改目标值在map中的迭代器return target.second;}void put(int key, int value) {if(m.find(key)!=m.end()){   //如果缓存中有键值,删除l.erase(m[key]);}else{if(cap==l.size()){      //如果缓存中没有,如果容器大小封顶了,那么删除末尾m.erase(l.back().first);l.pop_back();}}//将新键值对添加回队列开头,并且更新mapl.push_front(make_pair(key,value));m[key]=l.begin();}
};

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx环境搭建、负载均衡测试

Nginx环境搭建、负载均衡测试 系统环境&#xff1a; win10&#xff0c;IDEA2020&#xff0c;JDK8 一、nginx环境搭建 1.ngxin下载 Nginx官网下载&#xff1a; http://nginx.org/en/download.html Nginx有三种版本&#xff0c;分别是Mainline version&#xff08;开发版&…

智慧公厕,公共厕所数字化促进智慧城市管理的成效

随着科技的不断进步和城市化的快速发展&#xff0c;城市管理也面临着新的挑战和机遇。而智慧公厕作为基层配套设施&#xff0c;通过数字化提升城市管理的效能&#xff0c;成为了现代智慧城市建设的重要一环。本文以智慧公厕领先厂家广州中期科技有限公司&#xff0c;大量项目案…

安装Linux虚拟机——以ubuntukylin-16.04.7-desktop-amd64.iso为例

正文 安装VMware 重要提示 安装软件之前&#xff0c;请先退出360、电脑管家等安全类软件&#xff0c;这类软件会阻止我们安装的软件进行注册表注册&#xff0c;很可能导致安装失败。确认物理机&#xff08;也就是你自己使用的电脑&#xff09;的防火墙已经关闭。 下载 打开…

深入学习 Redis - 分布式锁底层实现原理,以及实际应用

目录 一、Redis 分布式锁 1.1、什么是分布式锁 1.2、分布式锁的基础实现 1.2.1、引入场景 1.2.2、基础实现思想 1.2.3、引入 setnx 1.3、引入过期时间 1.4、引入校验 id 1.5、引入 lua 脚本 1.5.1、引入 lua 脚本的原因 1.5.2、lua 脚本介绍 1.6、过期时间续约问题&…

Linux系统上使用SQLite

1. 安装SQLite 在Linux上安装SQLite非常简单。可以使用包管理器&#xff08;如apt、yum&#xff09;直接从官方软件源安装SQLite。例如&#xff0c;在Ubuntu上使用以下命令安装SQLite&#xff1a; sudo apt-get install sqlite32. 打开或创建数据库 要打开或创建一个SQLite数…

2023华为杯数学建模D题第三问-碳排放路径优化(能源消费结构调整的多目标优化模型构建详细过程+模型假设(可复制))

1.碳排放约束下&#xff08;人为干预按时碳达峰与碳中和的基准情景&#xff09;能源消费结构多目标优化模型构建 1.1基本假设 本文的模型设计主要基于以下几个基本假设&#xff1a; &#xff08;1&#xff09;能源消费结构调整的根本驱动要素&#xff0c;是对投资耗费的最小化…

基于JAVA+SpringBoot+Vue+协同过滤算法+爬虫的前后端分离的租房系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着城市化进程的加快…

代码随想录|647. 回文子串,516.最长回文子序列

647. 回文子串 1.dp含义 dp[i][j]&#xff1a;表示区间范围[i,j] &#xff08;注意是左闭右闭&#xff09;的子串是否是回文子串&#xff0c;如果是,则dp[i][j]为true&#xff0c;否则为false。 2.dp递推公式 整体上是两种&#xff0c;就是s[i]与s[j]相等&#xff0c;s[i]与…

AI AIgents时代 - (四.) HuggingGPT MetaGPT

&#x1f7e2; HuggingGPT HuggingGPT是一个多模型调用的 Agent 框架&#xff0c;利用 ChatGPT 作为任务规划器&#xff0c;根据每个模型的描述来选择 HuggingFace 平台上可用的模型&#xff0c;最后根据模型的执行结果生成总结性的响应。 这个项目目前已在 Github 上开源&am…

Mybatis学习笔记7 参数处理专题

Mybatis学习笔记6 使用时的一些小技巧_biubiubiu0706的博客-CSDN博客 1.单个简单类型参数 2.Map参数 3.实体类参数 4.多参数 5.Param注解(命名参数) 6.Param源码分析 建表 插入点数据 新建模块 pom.xml <?xml version"1.0" encoding"UTF-8"?&…

数据结构(java)--队列1

一、我们还是依旧引入一个小例子&#xff08;银行排队&#xff09;&#xff1a; 需要取号排队&#xff0c;服务完下一个 二、队列介绍 1&#xff09;队列是一个有序列表&#xff0c;可以用数组或是链表来实现 2&#xff09;遵循先入先出的原则。即&#xff1a;先存入队列的数…

肖sir__项目实战讲解__004

项目实战讲解 一、项目的类型 金融类&#xff1a; 保险(健康险理财险)、证券、基金(股票型基金、混合型基金、指数型基金、债券型基金、 天天基金网&#xff08;ETF基金、货币型基金、量化基金)、银行、贷款、信用卡、外汇、二元期权、期货原油、blockchain、 数字货币、黄金白…

机器学习之正则化与验证提高模型泛化

文章目录 正则化&#xff08;Regularization&#xff09;&#xff1a;验证&#xff08;Validation&#xff09;&#xff1a; 正则化和验证是机器学习中重要的概念&#xff0c;它们帮助提高模型的性能和泛化能力。让我详细介绍一下这两个概念&#xff1a; 正则化&#xff08;Re…

三维重建_纹理重建与表面细化

目录 前言&#xff1a;为什么要重建纹理&#xff1f; 1. 纹理图像的自动创建 1.1 基础知识 1.2 算法流程 1.2.1 视角选择 1.2.2 纹理坐标的计算 1.2.3 全局颜色调整 1.2.4 泊松图像编辑 1.2.5 OBJ文件 1.3 结果示例 2. 网格细化优化 2.1 基础知识与数学模型 2.2 优…

TLS/SSL(十) session缓存、ticket 票据、TLS 1.3的0-RTT

一 TLS优化手段 TLS 为了提升握手速度而提出优化手段,主要是减少TLS握手中RTT消耗的时间关于session cache和session ticket,nginx关于ssl握手的地方都有影子 [指令] https面经 ① session 缓存 resume: 重用,复用 案例&#xff1a; 第二次访问www.baidu.com 说明&#x…

解决域控制器的传感器配置问题

gpu加速计划 下载东西有时会报没有apt-utils&#xff0c;所以最好先给它下了&#xff1a; sudo apt-get install apt-utils验证&#xff1a; python #输入库 import torch #查看版本 print(torch.__version__) #查看gpu是否可用 torch.cuda.is_available() #返回设备gpu个数…

解决typescript报错=》不能将类型“undefined”分配给类型“boolean”

报错如下&#xff1a; 然后看看isSearch的类型定义&#xff1a; isSearch的定义是可选属性&#xff0c;但是TypeScript 中将一个参数标记为可选时&#xff0c;它的默认值将是 undefined。可选参数表示你可以选择性地提供该参数&#xff0c;如果不提供&#xff0c;那么它将默认为…

八一书《乡村振兴战略下传统村落文化旅游设计》许少辉瑞博士生辉少许——2023学生开学季许多少年辉光三农

八一书《乡村振兴战略下传统村落文化旅游设计》许少辉瑞博士生辉少许——2023学生开学季许多少年辉光三农

阿里云服务器+Frp+Proxifier工具进行内网穿透

阿里云服务器FrpProxifier工具进行内网穿透 为什么进行内网穿透&#xff1f; 什么叫内网穿透&#xff1f; 首先我们对内网和外网这两个名词做个解释&#xff1a; 内网&#xff1a;是内部建立的局域网络或办公网络,例如家庭内部网络&#xff0c;公司内部网络&#xff1b; 外…

【力扣485】最大连续 1 的个数

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述二、题目分析1、最值模拟2、双指针 一、题目描述 题目链接&#xff1a;最大连续 1 的个数 给定一个二进制数…