剑指 Offer II 031. 最近最少使用缓存
题目链接
剑指 Offer II 031. 最近最少使用缓存 mid
题目描述
运用所掌握的数据结构,设计和实现一个 LRU(Least Recently Used,最近最少使用) 缓存机制 。
实现 LRUCache类:
LRUCache(int capacity)以正整数作为容量capacity初始化LRU缓存int get(int key)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。void put(int key, int value)如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。
示例:
输入
[“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
提示:
- 1<=capacity<=30001 <= capacity <= 30001<=capacity<=3000
- 0<=key<=100000 <= key <= 100000<=key<=10000
- 0<=value<=1050 <= value <= 10^50<=value<=105
- 最多调用 2∗1052 * 10^52∗105 次
get和put
解法:双向链表 + 哈希表
链表结点Node的设计:
struct Node{int key = 0;int val = 0;Node * prev = nullptr;Node * next = nullptr;Node(){}Node(int k,int v) : key(k),val(v){}};
我们用一个哈希表 m存储 [key,key对应的结点Node]。
我们默认链表的头节点是 最近最少使用的 ,所以一旦容量满了再插入新节点时,就需要删除头节点,同时删除头节点在 m中的记录。新节点插入到链表尾,m增加新插入结点的记录。
查询了一个已经存在链表中的结点之后,需要把它移动到链表尾部,因为使用过了。
时间复杂度 : O(n)O(n)O(n)
C++代码:
class LRUCache {
public:LRUCache(int capacity) {this->capacity = capacity;this->sz = 0;dummy = new Node();tail = dummy;}int get(int key) {if(!m.count(key)) return -1;moveToTail(key);return m[key]->val;}void put(int key, int value) {if(m.count(key)){m[key]->val = value;moveToTail(key);}else if(sz < capacity){addToTail(key,value);m[key] = tail;sz++;}else{deleteHead(key,value);}}private: struct Node{int key = 0;int val = 0;Node * prev = nullptr;Node * next = nullptr;Node(){}Node(int k,int v) : key(k),val(v){}};//最大容量int capacity;//链表中结点的数量int sz;//虚拟头节点,避免边界问题Node * dummy;//尾节点Node * tail;unordered_map<int,Node*> m;void moveToTail(int key){Node * node = m[key];//已经是尾节点 就直接返回if(node == tail) return;//删除node结点 //让node的前驱结点 直接 指向node的后继结点//让node的后继结点 直接 指向node的前驱结点node->prev->next = node->next;node->next->prev = node->prev;node->next = nullptr;node->prev = nullptr;//把 node 结点插入到尾节点node->prev = tail;tail->next = node;tail = node;}//新插入一个结点到尾结点void addToTail(int key,int val){Node * node = new Node(key,val);tail->next = node;node->prev = tail;tail = node;m[key] = tail;}//为了避免边界问题,我们不实际删除头节点,只用删除 m 中头节点的记录//把头节点的值 改为 新插入结点的 key 和 val,再移动到链表尾部void deleteHead(int key,int val){Node * node = dummy->next;m.erase(node->key);dummy->next->key = key;dummy->next->val = val;m[key] = dummy->next;moveToTail(key);}
};/*** 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);*/相关文章:
剑指 Offer II 031. 最近最少使用缓存
题目链接 剑指 Offer II 031. 最近最少使用缓存 mid 题目描述 运用所掌握的数据结构,设计和实现一个 LRU(Least Recently Used,最近最少使用) 缓存机制 。 实现 LRUCache类: LRUCache(int capacity)以正整数作为容量 capacity初始化 LRU缓…...
44岁了,我从没想过在CSDN创作2年,会有这么大收获
1998年上的大学,02年毕业,就算从工作算起,我也有20余年的码龄生涯了。 但正式开启博文的写作,却是2021年开始的,差不多也就写了2年的博客,今天我来说说我在CSDN的感受和收获。 我是真的没想到,…...
相位相参信号源的设计--示波器上的信号不稳定,来回跑?
目录乱跑的波形边沿触发触发方式外部触发相参与非相参相位相参的射频信号源样机外观与内部设计软件设计上位机软件信号源使用方法PWM触发信号射频信号的时域波形射频信号的频谱输出功率在示波器的实际使用当中波形在示波器的时域上乱跑,左右移动,定不下来…...
Spring Boot 整合 RabbitMQ 多种消息模式
Spring Boot 整合 RabbitMQ 多种消息模式 准备工作集成 RabbitMQ发布/订阅模式点对点模式主题模式总结Spring Boot 是一个流行的 Java 应用程序开发框架,而 RabbitMQ 是一款可靠的消息队列软件。将 Spring Boot 和 RabbitMQ 结合起来可以帮助我们轻松地实现异步消息传递。Rabb…...
node多版本控制
前言 最近在折腾Python,并将node升级至v18.14.2。突然发现一个旧项目无法运行,也无法打包,里面的node-sass报错,显然这是因为node版本过高导致的。 将node版本降低至以前的v14.16.0,果然立马就能正常运行。 存在不同…...
Redis set集合
Redis set (集合)遵循无序排列的规则,集合中的每一个成员(也就是元素,叫法不同而已)都是字符串类型,并且不可重复。Redis set 是通过哈希映射表实现的,所以它的添加、删除、查找操作…...
漫画:什么是希尔排序算法?
希尔排序(ShellSort)是以它的发明者Donald Shell名字命名的,希尔排序是插入排序的改进版,实现简单,对于中等规模数据的性能表现还不错 一、排序思想 前情回顾:漫画:什么是插入排序算法…...
问卷工具选择要看哪些方面?
通常来讲,我们在使用一款问卷制作工具制作问卷时会有哪些需求呢? 一、用户需求 1、操作简单,易上手。 2、能够满足用户个性化的需求。 3、提供多语言服务。 4、能够帮助发布以及数据收集。 5、简化数据分析 市面上的问卷调查制作工具都…...
Qt之QPainter绘制多个矩形/圆形(含源码+注释)
一、绘制示例图 下图绘制的是矩形对象,但是将绘制矩形函数(drawRect)更改为绘制圆形(drawEllipse)即可绘制圆形。 二、思路解释 绘制矩形需要自然要获取矩形数据,因此通过鼠标事件获取每个矩形的rect数…...
介绍两款红队常用的信息收集组合工具
介绍两款红队常用的信息收集组合工具1.Ehole本地识别FOFA识别结果输出2.AlliN1.Ehole EHole(棱洞)3.0 红队重点攻击系统指纹探测工具 EHole是一款对资产中重点系统指纹识别的工具,在红队作战中,信息收集是必不可少的环节,如何才能从大量的资…...
类ChatGPT国产大模型ChatGLM-6B,单卡即可运行
2023年3月14日GPT4又发布了,在ChatGPT发展如火如荼的当下,我们更应该关注国内的进展,今天将分享一个清华大学基于GLM-130B模型开发的类似ChatGPT的ChatGLM-6B模型,ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型࿰…...
vue的diff算法?
文章目录是什么比较方式原理分析Diff算法的步骤:首尾指针法比对顺序:是什么 diff 算法是一种通过同层的树节点进行比较的高效算法 其有两个特点: 比较只会在同层级进行, 不会跨层级比较 在diff比较的过程中,循环从两边向中间比较…...
C++ | 对比inline内联函数和宏的不同点
文章目录一、前言二、宏的优缺点分析1、概念回顾2、宏的缺点3、宏的优点三、inline内联函数1、概念2、特性①:空间换时间🎁趣味杂谈:庞大的游戏更新包3、特性②:inline实现机制4、特性③:inline的声明与定义反汇编观察…...
面试官问 : ArrayList 不是线程安全的,为什么 ?(看完这篇,以后反问面试官)
前言 金三银四 ? 也许,但是。 近日,又收到金三银四一线作战小队成员反馈的战况 : 我不管你从哪里看的面经,但是我不允许你看到我这篇文章之后,还不清楚这个面试问题。 本篇内容预告: Array…...
Linux串口应用编程
一、 串口API 在Linux系统中,操作设备的统一接口就是:open/ioctl/read/write。 对于UART,又在ioctl之上封装了很多函数,主要是用来设置行规程。 所以对于UART,编程的套路就是: open设置行规程,比如波特率、数据位、停止位、检验位、RAW模式、一有数据就返回read/write 怎么设置…...
java程序员学前端-HTML篇
HTML 与 CSS HTML 是什么:即 HyperText Markup language 超文本标记语言,咱们熟知的网页就是用它编写的,HTML 的作用是定义网页的内容和结构。 HyperText 是指用超链接的方式组织网页,把网页联系起来Markup 是指用 <标签>…...
【云原生|Docker】03-docker的基础操作
目录 前言 查询相关 容器相关 1. 容器启动 2. 容器关闭 3. 重启容器 4. 暂停容器 5. 删除容器 6. docker run参数汇总 镜像相关 1. 镜像推送至仓库 2. docker image load使用 3. docker image import使用 4. dokcer image参数汇总 前言 容器的命…...
vue2+高德地图web端开发使用
创建vue2项目我们创建一个vue2项目,创建vue2项目就不用再多说了吧,使用“vue create 项目名 ”创建即可注册高德地图高德地图官网地址:https://lbs.amap.com/如果是第一次使用,点击注册然后进入我们的控制台注册完之后进入控制台&…...
01背包问题c++
问题 问题介绍 有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。 第 i 种物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第…...
ZYNQ硬件调试-------day2
ZYNQ硬件调试-------day2 1.ILA(Integrated Logic Analyzer ) 监控逻辑内部信号和端口信号;可以理解为输出。可单独使用 2.VIO(Virtual Input/Output ) 实时监控和驱动逻辑内部信号和端口信号,可以理解为触发输入。不可…...
别再乱改注册表了!详解Windows桌面路径修改与explorer进程重启的底层逻辑
Windows桌面路径修改与explorer进程重启的底层逻辑解析 每次修改Windows注册表时,你是否真正理解背后的运行机制?当我们将桌面路径从默认位置迁移到D盘后,简单的"还原默认值"操作有时并不能完全解决问题。这背后涉及Windows Shell …...
别再死记硬背了!用‘四体交叉’和‘双端口RAM’的实战题目,彻底搞懂计算机组成原理的存储器提速
从四体交叉到双端口RAM:用实战思维破解存储器提速难题 计算机组成原理中那些晦涩的存储器提速概念,是否总让你在题海中迷失方向?当"单体多字"、"多体并行"、"四体交叉"这些术语在教材里冰冷排列时,…...
Qwen3-TTS-12Hz-1.7B-Base语音克隆质量评测:与原声对比分析
Qwen3-TTS-12Hz-1.7B-Base语音克隆质量评测:与原声对比分析 1. 引言 语音克隆技术近年来发展迅猛,但真正能做到"以假乱真"的模型并不多见。Qwen3-TTS-12Hz-1.7B-Base作为阿里云最新开源的语音合成模型,号称仅需3秒音频就能克隆任…...
Janus-Pro-7B文生图作品展:中国风角色、科幻机甲、自然生态高清图集
Janus-Pro-7B文生图作品展:中国风角色、科幻机甲、自然生态高清图集 1. 模型能力概览 Janus-Pro-7B是DeepSeek推出的统一多模态模型,它在一个框架内同时实现了图像理解和文本生成图像两大核心功能。这个设计思路很巧妙——传统上,理解图像和…...
Llama-3.2V-11B-cot惊艳效果:将儿童涂鸦转化为含因果逻辑的故事描述
Llama-3.2V-11B-cot惊艳效果:将儿童涂鸦转化为含因果逻辑的故事描述 1. 模型能力概览 Llama-3.2V-11B-cot 是一个突破性的视觉语言模型,它能将简单的儿童涂鸦转化为包含完整因果逻辑的故事描述。这个基于LLaVA-CoT论文实现的模型,展现了令人…...
IMU660RA姿态解算实战:从传感器滤波到欧拉角输出的完整实现
1. IMU660RA姿态解算入门指南 刚拿到IMU660RA传感器时,我和大多数工程师一样兴奋又忐忑。这款常用于无人机和智能车的惯性测量单元,能提供关键的姿态数据,但原始数据就像未经打磨的玉石——需要一系列处理才能展现价值。姿态解算的核心目标&a…...
十字军之王II双字节字符显示解决方案:从乱码到完美支持的技术实现
十字军之王II双字节字符显示解决方案:从乱码到完美支持的技术实现 【免费下载链接】CK2dll Crusader Kings II double byte patch /production : 3.3.4 /dev : 3.3.4 项目地址: https://gitcode.com/gh_mirrors/ck/CK2dll 当《十字军之王II》玩家第一次在游戏…...
Rplidar 报错 RESULT_OPERATION_TIMEOUT 排查指南:从波特率到硬件自检的完整流程
1. 遇到RESULT_OPERATION_TIMEOUT报错时的心态调整 第一次看到Rplidar弹出"Error, operation time out. RESULT_OPERATION_TIMEOUT!"的时候,我也是一头雾水。这种报错就像突然断电的电脑——你不知道是电源线松了还是主板烧了。但根据我处理过上百次这类问…...
全自动洗衣机组态王与三菱PLC联机及仿真探索
全自动洗衣机组态王6.53,6.60和三菱PLC联机和仿真程序包最近在研究自动化控制领域相关内容,接触到了全自动洗衣机组态王 6.53、6.60 与三菱 PLC 的联机以及仿真程序包,感觉很有意思,今天就来和大家分享分享。 一、组态王与三菱 PLC 联机的意义…...
Qwen3.5-4B-Claude-Opus实战案例:Top-P=0.9时逻辑结论一致性测试
Qwen3.5-4B-Claude-Opus实战案例:Top-P0.9时逻辑结论一致性测试 1. 模型介绍 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是一个基于Qwen3.5-4B的推理蒸馏模型,特别强化了结构化分析、分步骤回答以及代码与逻辑类问题的处理能力。该模型以GG…...
