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

leetcode 面试150之 156.LUR 缓存

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

题目重点:O(1)实现查找和删除

O(1)查找我们可以通过unordered_map底层哈希表来实现
这里我们如果缓存满了还得删除最久未使用关键字 ,所以我们得使用一个O(1)维护的“使用队列”,数组我们无法实现O(1)删除,而双向链表能实现O(1)删除,但是无法实现O(1)查询

所以我们这里用到了unordered_map<int,listnode*>映射为listnode*,通过map去实现O(1)查询
而listnode*双向链表实现O(1)插入和删除

起初我并未想到用双向链表而是用deque去维护“使用队列”,后者在维护队列无法做到O(1),包超时的

上代码:

class LRUCache {
public:struct listnode{int key;int val;listnode* pre;listnode* next;listnode(int k,int v):key(k),val(v),pre(nullptr),next(nullptr){}};int max_;                          //最大空间listnode* head;                    //头哨兵节点listnode* tail;                    //尾哨兵节点unordered_map<int,listnode*> dp;   //精华//初始化    LRUCache(int capacity) {max_=capacity;head=new listnode(0,0);tail=new listnode(0,0);head->next=tail;tail->pre=head;}//双向链表头插法 将处理的node节点 使用优先级提高void addnode(listnode* node){node->next=head->next;head->next->pre=node;head->next=node;node->pre=head;}//断开node节点 并未delete  void remove_node(listnode* node){node->pre->next=node->next;node->next->pre=node->pre;}//查询数据int get(int key) {if(dp.count(key))          //查询成功 提高该节点的“使用队列”优先级{remove_node(dp[key]);addnode(dp[key]);return dp[key]->val;}else return -1;}//插入数据void put(int key, int value) {if(dp.count(key)){dp[key]->val=value;    //已经存在   更新val后,取走节点后插入头  提高优先级remove_node(dp[key]);addnode(dp[key]);}//key不存在else{if(max_==dp.size())          //空间已满  删除优先级低节点 也就是 tail->pre{listnode* temp=tail->pre;remove_node(temp);dp.erase(temp->key);delete temp;               //释放内存}//无论空间是否够 都需要插入这个key节点listnode* node=new listnode(key,value); addnode(node);dp.insert({key,node});}}
};/*** Your LRUCache object will be instantiated and called as such:* LRUCache* obj = new LRUCache(capacity);* int param_1 = obj->get(key);* obj->put(key,value);*/

相关文章:

leetcode 面试150之 156.LUR 缓存

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

启发式搜索算法复现

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月21日19点05分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅…...

【IDE】使用指南

定期更新实用技能&#xff0c;建议关注收藏点赞。 友情链接&#xff1a; 点击跳转常见代码编辑器的报错解决方案 目录 常用快捷键pycharm右下角边栏脚本头安装IDE的插件git配置TODO 代码编辑器里有许多小技巧&#xff0c;便于办公。本篇主要以pycharm,vscode等主流常用IDE为…...

设计编程网站集:简述可扩展性系统设计(笔记)

视频连接&#xff1a;简述可扩展性系统设计 三个关键原则 无状态 松散耦合 异步处理 扩展 负载均衡 缓存 分片...

「Mac玩转仓颉内测版25」基础篇5 - 布尔类型详解

本篇将介绍 Cangjie 中的布尔类型&#xff0c;包括布尔值的定义、运算操作符、逻辑运算、布尔类型的常见应用场景及其在条件判断中的应用&#xff0c;帮助开发者理解和使用布尔类型。 关键词 布尔类型定义布尔运算逻辑运算符条件判断常见应用场景 一、布尔类型概述 布尔类型&…...

Fashion-VDM:引领视频虚拟试穿技术的新篇章

引言 随着虚拟现实和增强现实技术的飞速发展,视频虚拟试穿(VVT)已成为时尚产业的一大创新领域。然而,现有的VVT方法在服装细节和时间一致性方面仍存在诸多不足。为了解决这些问题,Johanna Karras等人提出了Fashion-VDM,一种基于视频扩散模型(VDM)的新型视频虚拟试穿技…...

Scala中的集合复习(1)

Map、Set、Array、List 一、集合的三大类 1.序列Seq表示有先后顺序的集合。&#xff08;Array、List&#xff09; 2.集Set&#xff1a;表示无序且不重复的集合。 3.映射Map&#xff1a;表示键值对。 Stack&#xff1a;栈&#xff0c;特点是&#xff1a;后进先出。 packag…...

Java依赖包漏洞检测命令

1、漏洞扫描工具 maven插件方式&#xff1a;Dependency-Check 2、命令 检查单个 Maven 工程的安全漏洞 mvn dependency-check:check 这个命令会在 target 目录下生成一个 dependency-check-report.html 文件&#xff0c;其中包含了依赖项的安全漏洞分析报告。 检查多个 M…...

【Java】强制类型转换

int a23; short b(short) a; 小的接受大的接受不了&#xff0c;强制类型转换. 带有Buffer的&#xff0c;带有流的&#xff0c;都是数组。 网络流&#xff0c;文件流都是数组. 这种就是流。 操作系统底层就是C. 没有直系关系的&#xff0c;不让转换 语法不报错&#xff0c;运行…...

RabbitMQ消息可靠性保证机制4--消费端限流

7.7 消费端限流 在类似如秒杀活动中&#xff0c;一开始会有大量并发写请求到达服务端&#xff0c;城机对消息进行削峰处理&#xff0c;如何做&#xff1f; 当消息投递的速度远快于消费的速度时&#xff0c;随着时间积累就会出现“消息积压”。消息中间件本身是具备一定的缓冲…...

查找萤石云IOS Sdk中的编解码接口

2021/1/20 以前的时候&#xff0c;碰到的问题&#xff0c;想把萤石云视频介入到TRTC&#xff0c;但是... 萤石云的IOS接口中没有相应的解码播放库&#xff0c;也就是找不到PlayerSDK对应部分&#xff0c;怎么做呢&#xff1f; 一个是坐等萤石云开放这部分接口&#xff0c;可能…...

erchas

#include <iostream> #include <vector> https://gitee.com/tongchaowei/front-native-page-template/tree/main/image-display/template-01 using namespace std; class BinaryTree { private: vector<char> tree; // 存储二叉树的数组 int size;…...

【网络安全】SSL(一):为什么需要 Keyless SSL?

未经许可,不得转载。 文章目录 背景正文背景 随着网站和应用程序向云端迁移,使用 HTTPS(SSL/TLS)加密流量已成为行业标准。然而,传统的 HTTPS 配置要求服务器持有网站的私钥,这在云计算环境中引发了一系列安全性和合规性问题。一旦云服务器遭到攻击,私钥泄露可能带来不…...

ggplot2 分面图等添加注释文字,相加哪里加哪里: 自定义函数 AddText()

如果分面图上还想再添加文字&#xff0c;只能使用底层的grid包了。 函数定义 # Add text to ggplot2 figures # # param label text you want to put on figure # param x position x, left is 0, right 1 # param y position y, bottom is 0, up 1 # param color text color…...

解读缓存问题的技术旅程

目录 前言1. 问题的突发与初步猜测2. 缓存的“隐身术”3. 缓存策略的深层优化4. 反思与感悟结语 前言 那是一个普通的工作日&#xff0c;团队例行的早会刚刚结束&#xff0c;我正准备继续优化手头的模块时&#xff0c;突然收到了用户反馈。反馈的内容是部分数据显示异常&#…...

洛谷P1597

语句解析 - 洛谷 语句解析 题目背景 木有背景…… 题目描述 一串长度不超过255的 PASCAL 语言代码&#xff0c;只有 a,b,c 三个变量&#xff0c;而且只有赋值语句&#xff0c;赋值只能是一个一位的数字或一个变量&#xff0c;每条赋值语句的格式是 [变量]:[变量或一位整数…...

2411rust,76~79

1.76.0稳定版 此版本较小 ABI兼容更新 函数指针文档中新增的ABI兼容部分介绍了函数签名与ABI兼容的意义.大部分是参数类型和返回类型的兼容,及在当前Rust中兼容的列表.文档仅描述现有兼容的状态. 一个新增功能是,现在保证符和u32是ABI兼容的.它们一直有相同大小和对齐方式,…...

vue2.0前端管理系统界面布局设置

前言 后台管理系统的核心就是用户管理、角色管理&#xff08;含权限分配&#xff09;、菜单管理&#xff0c;以及一些业务管理。业务管理通常以及根据不同的角色进行了权限分配。本次任务完成用户管理页面。 一 界面设计 1.引用Element 的Container 布局容器。 以上次博客中…...

4. SQL视图

MySQL中的视图&#xff08;View&#xff09;是一种虚拟表&#xff0c;本质是存储了一条SELECT语句。视图并不直接存储数据&#xff0c;而是动态生成结果集&#xff0c;帮助开发者简化查询逻辑和增强数据安全性。本文将从视图的基础概念到实际应用&#xff0c;逐步深入地探讨如何…...

Simulink学习笔记【PID UG联动仿真】

Simulink进行PID控制及调参&#xff1a; 建立系统动力学框图&#xff08;把状态方程翻译出来&#xff09;&#xff0c;设置成subsystem建立PID反馈回路。示波器叫scope&#xff0c;多变量输出用demux和mux。可以用自动调参Tune模块&#xff0c;调整响应速度和稳定性&#xff0…...

【Python】30个Python爬虫的实战项目!!!(附源码)

Python爬虫是数据采集自动化的利器。本文精选了30个实用的Python爬虫项目&#xff0c;从基础到进阶&#xff0c;每个项目都配有完整源码和详细讲解。通过这些项目的实战&#xff0c;可以全面掌握网页数据抓取、反爬处理、并发下载等核心技能。 一、环境准备 在开始爬虫项目前…...

uni-app 界面TabBar中间大图标设置的两种方法

一、前言 最近写基于uni-app 写app项目的时候&#xff0c;底部导航栏 中间有一个固定的大图标&#xff0c;并且没有激活状态。这里记录下实现方案。效果如下&#xff08;党组织这个图标&#xff09;&#xff1a; 方法一&#xff1a;midButton的使用 官方文档&#xff1a;ta…...

什么是Sass,有什么特点

Sass 概述 什么是 Sass&#xff1f; Sass&#xff08;Syntactically Awesome Style Sheets&#xff09;是一种 CSS 预处理器&#xff0c;它扩展了 CSS 的功能&#xff0c;使其更加强大和灵活。Sass 允许开发者使用变量、嵌套规则、混合宏、继承等高级特性&#xff0c;从而编写…...

服务器端渲染 (SSR) 与客户端渲染 (CSR)

嘿程序员&#xff01;我们都知道&#xff0c;新时代的 Javascript 已经彻底改变了现代网站的结构和用户体验。如今&#xff0c;网站的构建更像是一个应用程序&#xff0c;伪装成一个能够发送电子邮件、通知、聊天、购物、支付等的网站。今天的网站是如此先进、互动&#xff0c;…...

数据结构(Java版)第一期:时间复杂度和空间复杂度

目录 一、数据结构的概念 1.1. 什么是数据结构 1.2. 算法与数据结构的关系 二、算法效率 三、时间复杂度 3.1. 大O的渐进表⽰法 3.2. 计算冒泡排序的时间复杂度 3.3. 计算二分查找的时间复杂度 四、空间复杂度 4.1. 空间复杂度 4.2. 冒泡排序的空间复杂度 4.3.…...

基于web的音乐网站(Java+SpringBoot+Mysql)

目录 1系统概述 1.1 研究背景 1.2研究目的 1.3系统设计思想 2相关技术 2.1 MYSQL数据库 2.2 B/S结构 2.3 Spring Boot框架简介 3系统分析 3.1可行性分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3操作可行性 3.2系统性能分析 3.2.1 系统安全性 3.2.2 数据完整性 …...

用go语言后端开发速查

文章目录 一、发送请求和接收请求示例1.1 发送请求1.2 接收请求 二、发送form-data格式的数据示例 用go语言发送请求和接收请求的快速参考 一、发送请求和接收请求示例 1.1 发送请求 package mainimport ("bytes""encoding/json""fmt""ne…...

GeekChallenge 2024 第十五届极客大挑战 pwn AK

GeekChallenge 2024 第十五届极客大挑战 pwn AK &#x1f340;前言☘️ez_shellcode&#xff08;shellcode&#xff0c;栈溢出&#xff09;&#x1f33f;分析&#x1f33f;解题&#x1f33f;exp ☘️买黑吗喽了吗&#xff08;整数溢出&#xff0c;栈溢出&#xff09;&#x1f3…...

禅道是什么,nas是什么,ssh是什么,finalshell是什么,git命令feat 、fix分别什么意思

禅道&#xff08;Zentao&#xff09;是一款开源的项目管理软件&#xff0c;专为软件开发团队设计。它集成了项目管理、产品管理、质量管理、文档管理和事务管理等多种功能&#xff0c;旨在帮助团队提高工作效率和项目交付质量。禅道支持敏捷开发方法&#xff0c;同时也适用于传…...

点云-半径搜索法-Radius Search

核心作用 在于通过设定一个空间范围&#xff08;半径&#xff09;寻找点的邻域点集合&#xff0c;从而支持对局部区域的分析和操作。 因为空间半径不会随着密度变化而改变点云输出的结果&#xff0c;处理密度变化大的点云时很重要。 应用场景 稀疏点检测&#xff1a;当点云密度…...

全国免费自学网站有哪些/百度极速版客服电话

css 2d转换Hello! Today, from here we begin our journey into some advanced CSS topics like CSS transformations, which was included in the CSS3 specification. 你好&#xff01; 今天&#xff0c;从这里开始&#xff0c;我们进入一些高级CSS主题&#xff0c;例如CSS转…...

太原做网站培训/文案代写收费标准

前言 &#xff1a; 有很多时候看一些技术文章&#xff0c;总是停留在看的阶段&#xff0c;但是知识的学习在我看来分成三个步骤&#xff1a;first 。 了解-主要动作也就是看&#xff0c;或者听&#xff0c;比较浅显的学习方式&#xff0c;遗忘速度也比较快 &#xff1b; second…...

百科主题wordpress/北京seo外包公司要靠谱的

甘特图是什么&#xff1f; 甘特图&#xff08;Gantt chart&#xff09;又称为横道图、条状图(Bar chart)。其通过条状图来显示项目、进度和其他时间相关的系统进展的内在关系随着时间进展的情况。以提出者亨利劳伦斯甘特&#xff08;Henry Laurence Gantt&#xff09;先生的名…...

申请个人营业执照需要什么资料/深圳搜狗seo

自MySQL5.1.0起&#xff0c;增加了一个非常有特色的功能–事件调度器(Event Scheduler)&#xff0c;可以用做定时执行某些特定任务&#xff08;例如&#xff1a;删除记录、对数据进行汇总等等&#xff09;&#xff0c;来取代原先只能由操作系统的计划任务来执行的工作。更值得一…...

怎么样看网站用什么程序做的/百度模拟点击

extends与implements的区别与用法 在类的声明中&#xff0c;通过关键字extends来创建一个类的子类。一个类通过关键字implements声明自己使用一个或者多个接口。 extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方…...

石家庄建设局官方网站/网页搜索优化seo

我们通常使用cin和>>来输入字符或数字&#xff0c;但有时会出现问题&#xff0c;比如cin遇到空格就会停止&#xff0c;如果我们想输入带空格的字符串&#xff0c;比如"Hello World!"&#xff0c;它就只能读取到Hello&#xff0c;如下所示&#xff1a; #includ…...