146. LRU Cache

题目描述

146. LRU Cache

 

哈希表+双向链表

详见代码和注释:

class LRUCache {
private:int capacity_{0};int size_{0};struct Node{int key{0};int val{0};Node* pre{nullptr};Node* next{nullptr};Node(int k,int v,Node* pr,Node* nex):key(k),val(v),pre(pr),next(nex){}};Node* head_{nullptr};Node* tail_{nullptr};//使用哈希表让查找的时间复杂度降为O(1)unordered_map<int,Node*> data_;public:LRUCache(int capacity):capacity_(capacity) {//题目保证传入大于0的capacity,非法值没考虑}int get(int key) {if(data_.contains(key)){Node* node = data_[key];setHead(node);return node->val;}return -1;}void put(int key, int value) {if(data_.contains(key)){data_[key]->val = value;setHead(data_[key]);}else{if(capacity_ > 0 && size_ == capacity_){//缓存已满Node* to_delete_LRU_node = tail_;//需要删除尾结点,tail_结点就是Least Recently Used Nodetail_ = tail_->pre;//有可能tail_和head_是同一个结点,tail_->pre是nullptrif(tail_){//to_delete_LRU_node的前面还有结点tail_->next = nullptr;}else{//to_delete_LRU_node的前面已经没有结点,to_delete_LRU_node和head_指向同一个结点//下面会通过to_delete_LRU_node销毁头结点,需要将head_设置为nullptr,不能让head_指向不存在的内存head_ = nullptr;}data_.erase(to_delete_LRU_node->key);delete to_delete_LRU_node;size_--;}Node* newnode = new Node(key,value,nullptr,head_);if(head_){head_->pre = newnode;}else{//如果头结点head_不存在,那么尾结点tail_也一定不存在tail_ = newnode;}head_ = newnode;data_[key] = newnode;size_++;}}
private://将node设置为链表的头结点,输入的node不为nullptrvoid setHead(Node* node){if(node != head_){if(node == tail_){//node是尾结点的话,node前一个结点需要作为新的尾结点tailtail_ = tail_->pre;}// if(node->pre) 判断是多余的,node不是头结点,那么node的前一个结点一定不是nullptrnode->pre->next = node->next;if(node->next){//node的下一个结点可能不存在node->next->pre = node->pre;}node->pre = nullptr;node->next = head_;//前面的条件保证了此处head_一定不为nullptrhead_->pre = node;head_ = 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);*/

几组测试用例:

["LRUCache","put","put","get","put","get","put","get","get","get"][[2],[1,1],[2,2],[1],[3,3],[2],[4,4],[1],[3],[4]]
["LRUCache","put","put","get","put","get","put","get","get","get"][[2],[1,0],[2,2],[1],[3,3],[2],[4,4],[1],[3],[4]]
["LRUCache","put","get","put","get","get"][[1],[2,1],[2],[3,2],[2],[3]]

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

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

相关文章

docker network 自定义网络配置与管理指南

Docker 自定义网络配置与管理指南 1. 网络基础概念 Docker 网络是容器间通信和与外部世界交互的基础。通过自定义网络&#xff0c;可以实现容器间的隔离、静态 IP 分配和服务发现。 关键术语&#xff1a; 子网(Subnet)&#xff1a;IP 地址的逻辑分组&#xff0c;例如 172.1…

linux strace调式定位系统问题

strace 的基本功能 strace 的主要功能包括&#xff1a; 跟踪系统调用&#xff1a;显示进程执行时调用的系统函数及其参数和返回值。监控信号&#xff1a;记录进程接收到的信号。性能分析&#xff1a;统计系统调用的执行时间和次数。调试支持&#xff1a;帮助定位程序崩溃、性…

告别手抖困扰:全方位健康护理指南

手抖&#xff0c;医学上称为震颤&#xff0c;是常见的身体症状&#xff0c;可能由多种原因引发&#xff0c;了解其成因并采取科学护理措施&#xff0c;对改善症状、维护健康至关重要。 生理性手抖往往因情绪激动、过度劳累、大量饮用咖啡或酒精等引起&#xff0c;这种手抖通常较…

华为2025年校招笔试真题手撕教程(一)

一、题目 输入&#xff1a; 第一行为记录的版本迭代关系个数N&#xff0c;范围是[1&#xff0c;100000]; 第二行到第N1行&#xff1a;每行包含两个字符串&#xff0c;第一个字符串为当前版本&#xff0c;第二个字符串为前序版本&#xff0c;用空格隔开。字符串包含字符个数为…

Qt 的多线程

Qt 中的多线程主要用于处理耗时操作&#xff0c;避免阻塞主线程&#xff08;UI 线程&#xff09;&#xff0c;从而提高程序的响应性和运行效率。以下是 Qt 多线程的相关技术总结&#xff1a; 常见的多线程实现方式 继承 QThread 类 &#xff1a;最基础的实现方式&#xff0c;具…

基于ITcpServer/IHttpServer框架的HTTP服务器

https://www.cnblogs.com/MuZhangyong/p/16839231.html 在基于ITcpServer/IHttpServer框架的HTTP服务器实现中,OnBody方法主要用于接收HTTP请求体数据,而触发HTTP响应通常是在OnMessageComplete方法中完成。以下是完整的响应触发机制说明: sequenceDiagramClient->>…

Windows 下 Qt 项目配置 FFmpeg 简明指南

一、作用 在qt项目中配置ffmpeg库 二、步骤 1、直接使用已经编译好的ffmpeg库文件&#xff0c;分为win32版本和win64版本&#xff1b; 2、win32版本下载地址&#xff1a;https://github.com/sudo-nautilus/FFmpeg-Builds-Win32/releases/tag/latest 3、win64版本下载地址&a…

Attu下载 Mac版与Win版

通过Git地址下载 Mac 版选择对于的架构进行安装 其中遇到了安装不成功&#xff0c;文件损坏等问题 一般是两种情况导致 1.安装版本不对 2.系统权限限制 https://www.cnblogs.com/similar/p/11280162.html打开terminal执行以下命令 sudo spctl --master-disable安装包Git下载地…

SpringBoot3集成Oauth2.1——5资源地址配置

配置问题说明 如下所示&#xff0c;代码配置了两个&#xff0c;过滤器&#xff0c;一个是资源保护&#xff0c;一个是不保护。 /** Description: 配置需要保护的资源* author: 胡涛* mail: hutao_2017aliyun.com* date: 2025年5月23日 下午2:28:20*/BeanOrder(2)public Securi…

Python urllib.parse 模块中的 urljoin 方法

Python urllib.parse 模块中的 urljoin 方法 urljoin 是 Python 标准库中 urllib.parse 模块的一个方法&#xff0c;用于将基础 URL 和相对路径拼接成完整的 URL。它会根据传入的基础 URL 自动处理协议、域名以及路径的部分匹配逻辑。 以下是关于该方法的具体说明和示例&…

AI大模型和SpringAI简介

一、Spring AI 简介 SpringAI整合了全球&#xff08;主要是国外&#xff09;的大多数大模型&#xff0c;而且对于大模型开发的三种技术架构都有比较好的封装和支持&#xff0c;开发起来非常方便。 不同的模型能够接收的输入类型、输出类型不一定相同。SpringAI根据模型的输入…

在TIA 博途中下载程序时找不到对应的网卡怎么办?

1. 检查物理连接 确认网线已正确连接PLC和PC&#xff0c;接口指示灯正常。 尝试更换网线或交换机端口&#xff0c;排除硬件故障。 2. 确认网卡驱动已安装 设备管理器检查&#xff1a; 右键点击“此电脑” → “管理” → “设备管理器”。 展开“网络适配器”&#xff0c;确…

Zabbix实践!客户端自动发现

在线答疑&#xff1a;乐维社区 一、客户端状态检查 1.检查客户端的zabbix-agent2是否正常 [rootnode1 ~]# systemctl is-active zabbix-agent2.service active 2.从服务端检查是否可以获得客户端信息 [rootIT-01 ~]# zabbix_get -s ‘192.168.200.135’ -p 10050 -k ‘agent.p…

动态规划中的 求“最长”、“最大收益”、“最多区间”、“最优策略” 双重 for + 状态转移

以最长递增子序列为例 &#x1f3af; 首先明确目标 以最长上升子序列&#xff08;LIS&#xff09;为例&#xff0c;假设输入是&#xff1a; nums : []int{10, 9, 2, 5, 3, 7, 101, 18}我们定义&#xff1a; dp[i]&#xff1a;以 nums[i] 为结尾的最长上升子序列长度目标&…

SEO关键词与长尾词高效布局

内容概要 在SEO优化实践中&#xff0c;关键词布局的科学性与系统性直接影响流量的获取效率与可持续性。本文以核心关键词筛选为起点&#xff0c;结合长尾词挖掘工具与语义关联分析技术&#xff0c;逐步构建覆盖用户全搜索场景的内容矩阵。通过金字塔结构模型&#xff0c;实现高…

考研数一公式笔记

考研数学&#xff08;一&#xff09;核心结论与易错点详细笔记 第一部分&#xff1a;高等数学 一、函数、极限、连续 (一) 重要结论与公式 等价无穷小替换 (仅限乘除运算&#xff0c;极限过程为 x → 0 或某特定值导致因子→0)&#xff1a; sin x ~ x tan x ~ x arcsin x …

Debezium TableSchemaBuilder详解

Debezium TableSchemaBuilder详解 1. 类的作用与功能 1.1 核心作用 TableSchemaBuilder是Debezium中负责构建表Schema的核心类,主要功能包括: Schema构建:将数据库表结构转换为Kafka Connect的Schema定义主键处理:生成表的主键Schema值Schema处理:生成表的非主键字段Sc…

49 python Matplotlib之Pandas 数据可视化

Pandas 是 Python 中用于数据处理的核心库,其内置了基于 Matplotlib 的可视化功能,可通过 DataFrame.plot() 和 Series.plot() 方法快速生成常见图表,无需手动编写绘图代码,大幅提升效率。 一、Pandas 核心绘图方法 基础语法如下:该代码为伪代码,仅做语法说明,无法执行…

《微服务架构设计模式》笔记

思维导图 1-3章 4-6 章 5-13 章 资料 配套代码仓库&#xff1a;https://github.com/microservices-patterns/ftgo-application 作者网站&#xff1a;https://microservices.io/

手写一个简单的线程池

手写一个简单的线程池 项目仓库&#xff1a;https://gitee.com/bossDuy/hand-tearing-thread-pool 基于一个b站up的课程&#xff1a;https://www.bilibili.com/video/BV1cJf2YXEw3/?spm_id_from333.788.videopod.sections&vd_source4cda4baec795c32b16ddd661bb9ce865 理…