当前位置: 首页 > 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实战:5分钟搞定Paillier同态加密的安装与基础使用(附避坑指南)

Python实战&#xff1a;5分钟搞定Paillier同态加密的安装与基础使用&#xff08;附避坑指南&#xff09; 隐私计算领域近年来发展迅猛&#xff0c;而同态加密作为其核心技术之一&#xff0c;正在金融、医疗等行业的数据协作场景中发挥越来越重要的作用。Paillier算法作为支持加…...

PX4飞控系统深度解析:从模块化架构到自主飞行核心技术揭秘

PX4飞控系统深度解析&#xff1a;从模块化架构到自主飞行核心技术揭秘 【免费下载链接】PX4-Autopilot PX4 Autopilot Software 项目地址: https://gitcode.com/gh_mirrors/px/PX4-Autopilot 你是否曾好奇&#xff0c;一个开源飞控系统如何支撑从微型无人机到工业级无人…...

小白友好!Gemma-3-12B-IT WebUI部署常见错误及修复方法

小白友好&#xff01;Gemma-3-12B-IT WebUI部署常见错误及修复方法 1. 为什么你的WebUI总是打不开&#xff1f; 你是不是也遇到过这种情况&#xff1a;跟着教程一步步部署Gemma-3-12B-IT的WebUI&#xff0c;最后一步打开浏览器&#xff0c;输入地址&#xff0c;结果页面一直转…...

保姆级教程:用seqtk、bwa和bedtools从零绘制GC-depth图,诊断测序污染

从零构建GC-depth分析全流程&#xff1a;手把手教你诊断测序数据污染 刚拿到测序数据的生物信息学新手&#xff0c;常常会面临一个灵魂拷问&#xff1a;我的数据干净吗&#xff1f;GC-depth分析就像给测序数据做"体检"&#xff0c;通过一张图就能快速发现细菌污染、样…...

文艺复兴,什么是XSS,常见形式(二)

前言 本文将继续介绍XSS的常见形状&#xff0c;依赖于portswigger提供的免费Lab环境&#xff0c;将重点介绍关于使用脚本来进行表单XSS验证以及针对标签的模糊测试。 Lab: Stored DOM XSS 这是一个存储型的DOM类的XSS&#xff0c;具体的是当你将内容提交到评论区&#xff0c…...

如何利用Blender MMD Tools实现跨平台3D模型与动画工作流

如何利用Blender MMD Tools实现跨平台3D模型与动画工作流 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools 副标题&am…...

CPU工作原理:从二进制加法器到计算系统

CPU工作原理&#xff1a;从二进制加法器到计算系统的演进 1. 计算需求与二进制表示 在数字计算领域&#xff0c;加法是最基础也是最重要的运算之一。让我们从一个简单的数学问题开始&#xff1a;6324 244675 &#xff1f;这个看似简单的加法问题&#xff0c;揭示了计算系统的…...

Spatial Audio(空间音频)与多声道环绕声:从5.1到7.1的沉浸式体验升级

1. 从立体声到环绕声&#xff1a;音频技术的进化之路 记得我第一次在朋友家体验5.1声道家庭影院时&#xff0c;那种子弹从耳边呼啸而过的感觉让我彻底震撼了。这完全颠覆了我对"好音质"的认知——原来声音可以如此立体、如此真实。要理解现代的空间音频技术&#xf…...

工业自动化实战:三大品牌伺服驱动器IO与串口引脚接线全解析

1. 伺服驱动器接线基础&#xff1a;为什么IO与串口引脚如此重要 第一次接触伺服驱动器时&#xff0c;我被密密麻麻的接线端子吓到了。后来才发现&#xff0c;只要理解几个核心引脚的功能&#xff0c;剩下的都是举一反三。伺服驱动器的IO和串口引脚就像机器的"神经系统&quo…...

wflow工作流设计器:5分钟快速上手的企业流程自动化完整指南

wflow工作流设计器&#xff1a;5分钟快速上手的企业流程自动化完整指南 【免费下载链接】wflow workflow 工作流设计器&#xff0c;企业OA流程设计。表单流程设计界面操作超级简单&#xff01;&#xff01;普通用户也能分分钟上手&#xff0c;不需要专业知识。本设计器支持可视…...