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

LeetCode146 LRU缓存

请你设计并实现一个满足 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) 的平均时间复杂度运行。

思路总结:DlinkNode结构体创建双链表,双链表有key和val;
pre和next指针,并且进行初始化。
哈希表cache存着key和双链表节点
初始化head和tail(head和tail并不存储实际数据)
在LRUCache函数中 要clear哈希表,并且把tail加进双链表
在addNode中 如果有 可以直接返回 如果没有就需要弄个cur
把cur放到head的后面最佳
在deltNode中 如果没有 可以直接返回 如果有就erase他
删除的操作就是把他的前后找到 然后前后接上 把他悬挂
在get操作中,如果没有这个 返回-1;
如果有 就要先给他deletNode 再给他addNode
在put操作中,如果有,就先deletNode 再addNode
如果没有,就看看现在的哈希表是不是等于容量
如果等于容量:那就把tail前一个给他deleNode了
如果不等于容量:简单直接addNode。

struct DlinkNode{int key;int val;DlinkNode*pre;DlinkNode*next;DlinkNode():key(-1),val(-1),next(nullptr),pre(nullptr){}DlinkNode(int _key,int _val):key(_key),val(_val),next(nullptr),pre(nullptr){}
};
class LRUCache {
private:
unordered_map<int,DlinkNode*>cache;DlinkNode*head;DlinkNode*tail;int limit;
public:LRUCache(int capacity) {limit=capacity;cache.clear();head=new DlinkNode();tail=new DlinkNode();head->next=tail;tail->pre=head;}int get(int key) {if(!cache.count(key)){return -1;}int val=cache[key]->val;deltNode(key);addNode(key,val);return val;}void put(int key, int value) {if(cache.count(key)){deltNode(key);addNode(key,value);}else{if(cache.size()==limit){deltNode(tail->pre->key);addNode(key,value);}else{addNode(key,value);}}}void addNode(int key,int val){//添加//在头部添加if(cache.count(key)){return;}DlinkNode*cur=new DlinkNode(key,val);cur->next=head->next;head->next->pre=cur;cur->pre=head;head->next=cur;cache[key]=cur;}void deltNode(int key){//删除if(!cache.count(key)){return;}DlinkNode*cur=cache[key];cache.erase(key);DlinkNode*front=cur->pre;DlinkNode*back=cur->next;front->next=back;back->pre=front;cur->pre=nullptr;cur->next=nullptr;}
};

相关文章:

LeetCode146 LRU缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返回 -1 …...

【Java】包装类【主线学习笔记】

文章目录 前言包装类基本数据类型与包装类之间的转换基本数据类型转换为包装类可以通过以下几种方式&#xff1a;包装类转换为基本数据类型可以通过以下几种方式&#xff1a;初始化值不同与String之间的转换 前言 Java是一门功能强大且广泛应用的编程语言&#xff0c;具有跨平台…...

华为HarmonyOS地图服务 11 - 如何在地图上增加点注释?

场景介绍 本章节将向您介绍如何在地图的指定位置添加点注释以标识位置、商家、建筑等&#xff0c;并可以通过信息窗口展示详细信息。 点注释支持功能&#xff1a; 支持设置图标、文字、碰撞规则等。支持添加点击事件。 PointAnnotation有默认风格&#xff0c;同时也支持自定…...

uniapp js怎么根据map需要显示的点位,计算自适应的缩放scale

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…...

Mysql 架构

目录 1.1 Mysql 逻辑架构图 1.2 SQL 的执行流程 1.3 SQL 书写顺序和执行顺序 1.4 Mysql 日志文件 1.4.1. 二进制日志&#xff08;Binary Log&#xff09; 1.4.2. 错误日志&#xff08;Error Log&#xff09; 1.4.3. 慢查询日志&#xff08;Slow Query Log&#xff09; 1.…...

C语言 | Leetcode C语言题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; #define MAX_LEVE_SIZE 1000 #define MAX_NODE_SIZE 10000int** levelOrder(struct Node* root, int* returnSize, int** returnColumnSizes) {int ** ans (int **)malloc(sizeof(int *) * MAX_LEVE_SIZE);*returnColumnSizes (int *)mal…...

Python中列表常用方法

# 定义列表: # 定义一个空列表 my_list []# 定义一个包含不同类型元素的列表 my_list [1, 2, 3, a, b, c, 2.5, True]# 定义一个嵌套列表&#xff08;列表中包含列表&#xff09; my_list [[1, 2, 3], [a, b, c], [2.5, True]]print(my_list[0]) # [1, 2, 3]# 访问元素: my…...

『功能项目』下载Mongodb【81】

下载网址&#xff1a;Download MongoDB Community Server | MongoDB 点击安装即可 选择Custom 此时安装已经完成 桌面会创建图标 检查是否配置好MongoDB 输入cmd命令行 Windows键 R 打开命令行 输入cmd 复制安装路径 复制data路径 如果输出一大串代码即配置mongdb成功...

图像特征提取-SIFT

文章目录 一、定义与原理二、主要步骤三、特点与优势四、代码运用五、应用领域 图像特征提取中的SIFT&#xff08;Scale-Invariant Feature Transform&#xff0c;尺度不变特征变换&#xff09;是一种强大的局部特征提取算法&#xff0c;广泛应用于计算机视觉和图像处理领域。以…...

ElasticSearch分页查询性能及封装实现

Es的分页方式 fromsize 最基本的分页方式&#xff0c;类似于SQL中的Limit语法&#xff1a; //查询年龄在12到32之间的前15条数据 {"query":{"bool":{"must":{"range":{"user_age":{"gte":12,"lte":3…...

Python精选200Tips:176-180

针对图像的经典卷积网络结构进化史及可视化 P176--LeNet-5【1988】模型结构说明模型结构代码模型结构可视化 P177--AlexNet【2012】模型结构及创新性说明模型结构代码模型结构可视化 P178--VGGNet【2014】VGG19模型结构及创新性说明VGG19模型结构代码VGG19模型结构可视化 P179-…...

【Kotlin 集合概述】可变参数vararg、中缀函数infix以及解构声明(二十)

导读大纲 1.1 使用集合: vararg、infix 调用和解构声明1.1.1 扩展 Java 集合 API1.1.2 vararg: 接受任意数量参数的函数1.1.3 处理pairs: Infix 调用和解构声明 1.1 使用集合: vararg、infix 调用和解构声明 本节将介绍 Kotlin 标准库中用于处理集合的一些函数 同时,还介绍一些…...

unity安装报错问题记录

unity安装报错问题记录 今天下载了unity&#xff0c;一路安装下来&#xff0c;遇到了两个问题&#xff1a; Microsoft Visual Studio Community 2022 Install failed: Validation Failed 查询资料提到本机已安装&#xff0c;实际本机未安装。 解决了半天&#xff0c;大致有…...

秋招|面试|群面|求职

秋招|面试|群面|求职 自我介绍30s-1min&#xff0c;首先是清楚的介绍自己的名字/专业等个人信息&#xff0c;面试岗位&#xff0c;也可以介绍一下对于岗位的理解。然后介绍一下过往经历中最亮眼的几点&#xff0c;主要是为了突出和岗位的适配程度。群面&#xff0c;我觉得最重…...

【Kubernetes】日志平台EFK+Logstash+Kafka【理论】

一&#xff0c;日志处理方案 方案一&#xff0c;【EFK】&#xff1a;Elasticsearch Fluentd&#xff08;或Filebeat&#xff09; Kibana Elasticsearch&#xff08;简称&#xff1a;ES&#xff09;&#xff1a;实时&#xff0c;分布式存储&#xff0c;可扩展&#xff0c;日…...

基于SpringBoot+Vue+MySQL的教学资料管理系统

系统展示 管理员后台界面 教师后台界面 系统背景 在当今信息化高速发展的时代&#xff0c;教育机构面临着日益增长的教学资料管理需求。为了提升教学管理的效率&#xff0c;优化资源的配置与利用&#xff0c;开发一套高效、便捷的教学资料管理系统显得尤为重要。基于SpringBoot…...

动态规划day45:编辑距离|115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离(动规终极好题)

动态规划day45:编辑距离|115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离(动规终极好题&#xff09; 115. 不同的子序列583. 两个字符串的删除操作72. 编辑距离(动规终极好题) 115. 不同的子序列 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中…...

剑指 offer 刷题集

目录 数组 1. LCR 121. 寻找目标值 - 二维数组 2. LCR 120. 寻找文件副本 3. LCR 128. 库存管理 I 4. LCR 131. 砍竹子 I 5. LCR 132. 砍竹子 II 6. LCR 135. 报数 7. LCR 139. 训练计划 I 8. LCR 158. 库存管理 II 9. LCR 159. 库存管理 III 10. LCR 160. 数据流中…...

C++在线开发环境搭建(WEBIDE)

C在线开发环境搭建 一、环境说明1.1 系统基础环境说明1.1 docker-ce社区版安装 二、codeserver构建2.1 构建codeserver环境的docker容器2.2 构建docker镜像2.3 运行docker2.4 运行展示 三、构建codeserver中的c开发环境3.1 插件下载3.2 插件安装 四、其他知识4.2 code-server配…...

重磅首发!大语言模型LLM学习路线图来了!

ChatGPT的出现在全球掀起了AI大模型的浪潮&#xff0c;2023年可以被称为AI元年&#xff0c;AI大模型以一种野蛮的方式&#xff0c;闯入你我的生活之中。 从问答对话到辅助编程&#xff0c;从图画解析到自主创作&#xff0c;AI所展现出来的能力&#xff0c;超出了多数人的预料&…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...