【力扣hot100题】(034)LRU缓存

做完这题已经没有任何力气写链表题了。

思路很简单,就是调试特别的痛苦。

老是频频报错,唉。

class LRUCache {
public:struct ListNode{int key,val;ListNode* next; ListNode* prev;ListNode() : key(0), val(0), next(nullptr), prev(nullptr) {}ListNode(int key, int value) : key(key), val(value), next(nullptr), prev(nullptr) {}ListNode(int key, int value, ListNode* next=nullptr, ListNode* prev=nullptr) : key(key), val(value), next(next), prev(prev) {}};ListNode* head=new ListNode();ListNode* tail=head;int capacity;map<int,ListNode*> hash;LRUCache(int capacity) {this->capacity=capacity;}int get(int key) {if(hash.find(key)!=hash.end()){if(head->next==hash[key]) return hash[key]->val;hash[key]->prev->next=hash[key]->next;if(hash[key]->next) hash[key]->next->prev=hash[key]->prev;if(hash[key]==tail) tail=hash[key]->prev;hash[key]->next=head->next;if(head->next) head->next->prev=hash[key];hash[key]->prev=head;head->next=hash[key];return hash[key]->val;}else return -1;}void put(int key, int value) {if(hash.find(key)!=hash.end()){hash[key]->val=value;get(key);return;}else if(capacity==0){hash.erase(tail->key);tail=tail->prev;tail->next=nullptr;}else capacity--;ListNode* newhead=new ListNode(key,value,head->next,head);if(tail==head) tail=newhead;if(head->next) head->next->prev=newhead;head->next=newhead;hash[key]=newhead;}
};/*** 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);*/

看了答案,其实有更好的做法,可以优化并且降低代码的复杂度,感觉我写代码还是太畏缩了。

优化方案一:将头指针和尾指针都设成虚拟指针,一个指向双向链表头部的前一个位置,一个指向尾部的后一个位置。(我写的时候为了节省空间复杂度只弄了一个头虚拟指针,还是太不敢了)

优化方案二:构造更多的函数,这样就可以直接调用,代码逻辑会清晰很多。

于是按这个改进思路又写了一遍,果然简单多了……

class LRUCache {
public:struct ListNode{int key,val;ListNode* next; ListNode* prev;ListNode() : key(0), val(0), next(nullptr), prev(nullptr) {}ListNode(int key, int value, ListNode* next=nullptr, ListNode* prev=nullptr) : key(key), val(value), next(next), prev(prev) {}};ListNode* head;ListNode* tail;int capacity;unordered_map<int,ListNode*> hash;LRUCache(int capacity) {this->capacity=capacity;head=new ListNode();tail=new ListNode(0,0,nullptr,head);head->next=tail;}int get(int key) {if(hash.find(key)==hash.end()) return -1;erase(hash[key]);insert(hash[key]);return hash[key]->val;}void put(int key, int value) {if(hash.find(key)!=hash.end()){hash[key]->val=value;erase(hash[key]);insert(hash[key]);return ;}if(capacity>0) capacity--;else if(capacity==0){hash.erase(tail->prev->key);erase(tail->prev);}ListNode* newnode=new ListNode(key,value,nullptr,nullptr);insert(newnode);hash[key]=newnode;}void erase(ListNode* node){node->prev->next=node->next;node->next->prev=node->prev;}void insert(ListNode* node){head->next->prev=node;node->next=head->next;node->prev=head;head->next=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);*/

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

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

相关文章

基于随机森林算法的信用风险评估项目

引言 这是一个基于随机森林算法的德国信用风险评估项目&#xff0c;主要目的是构建一个机器学习模型来评估德国客户的信用风险&#xff0c;判断客户是否为高风险客户。 # -*- coding: utf-8 -*- """ 德国信用风险评估随机森林模型 """ # 基础…

亚马逊云科技携手 DeepSeek:开启企业级生成式 AI 新征程

文章目录 一、DeepSeek-R1模型的技术突破&#xff08;一&#xff09;卓越的性能表现&#xff08;二&#xff09;独特的训练方法&#xff08;三&#xff09;丰富的模型生态 二、亚马逊云科技平台上的部署与优化&#xff08;一&#xff09;灵活的部署方式&#xff08;二&#xff…

Windows 实战-evtx 文件分析--笔记

Windows 取证之EVTX日志 - 蚁景网安实验室 - 博客园 一.evtx日志文件是什么 从 Windows NT 6.0&#xff08;也就是 Windows Vista 和 Windows Server 2008&#xff09;开始&#xff0c;微软引入了一种全新的日志文件格式&#xff0c;称为 evtx。这种格式取代了之前 Windows 系…

LangChain/Eliza框架在使用场景上的异同,Eliza通过配置实现功能扩展的例子

LangChain与Eliza框架的异同分析 ‌一、相同点‌ ‌模块化架构设计‌ 两者均采用模块化设计&#xff0c;支持灵活扩展和功能组合。LangChain通过Chains、Agents等组件实现多步骤任务编排‌&#xff0c;Eliza通过插件系统和信任引擎实现智能体功能的动态扩展‌。模块化特性降低…

英语口语 -- 常用 1368 词汇

英语口语 -- 常用 1368 词汇 介绍常用单词List1 &#xff08;96 个&#xff09;时间类气候类自然类植物类动物类昆虫类其他生物地点类 List2 &#xff08;95 个&#xff09;机构类声音类食品类餐饮类蔬菜类水果类食材类饮料类营养类疾病类房屋类家具类服装类首饰类化妆品类 Lis…

深挖 DeepSeek 隐藏玩法·智能炼金术2.0版本

前引&#xff1a;屏幕前的你还在AI智能搜索框这样搜索吗&#xff1f;“这道题怎么写”“苹果为什么红”“怎么不被发现翘课” &#xff0c;。看到此篇文章的小伙伴们&#xff01;请准备好你的思维魔杖&#xff0c;开启【霍格沃茨模式】&#xff0c;看我如何更新秘密的【知识炼金…

2025 年浙江危化品经营单位考试攻略分享​

浙江的考试由省应急管理部门主导。理论考试突出危化品在电商、物流等新兴业态下的安全管理知识&#xff0c;这与浙江发达的电商产业紧密相关。对危险化学品的环境危害及防治知识考查细致。实际操作考核模拟杭州、宁波等地危化品仓储物流中心的作业情况。​ 报名材料准备齐全后…

【区块链+ 房产建筑】山东省建筑产业互联网平台 | FISCO BCOS 应用案例

山东省建筑产业互联网平台&#xff08;山东省弘商易盟平台&#xff09;是基于区块链技术构建的分布式产业互联网平台&#xff0c; 旨在把各企业内部的供应链协同管理系统&#xff08;包括采购或者SRM 系统&#xff0c; 以及销售或CRM 系统&#xff09;利用区块链技术链接起来&a…

Bash 花括号扩展 {start..end} 进阶使用指南——字典生成

Bash 的花括号扩展&#xff08;brace expansion&#xff09;{start..end} 是一个强大而灵活的语法特性&#xff0c;用于生成特定序列或组合。它在脚本编写、爆破字典生成、文件批量操作以及模式匹配中有着广泛的应用。本文将从基础用法到高级技巧&#xff0c;带你全面掌握这一功…

23种设计模式-结构型模式-享元

文章目录 简介问题解决方案享元与不可变性享元工厂 代码总结 简介 亦称&#xff1a;缓存、Cache、Flyweight。享元是一种结构型设计模式&#xff0c;它摒弃了在每个对象中保存所有数据的方式&#xff0c;通过共享多个对象所共有的相同状态&#xff0c;让你能在有限的内存容量中…

MFC BCGControlBar

BCGControlBar&#xff08;也称为 BCGSoft 或 BCGControlBar Library&#xff09;是一个用于 MFC&#xff08;Microsoft Foundation Classes&#xff09; 的扩展库&#xff0c;主要提供现代化的 UI 控件、Ribbon 界面、工具栏、属性网格等组件&#xff0c;帮助开发者快速构建专…

【算法手记9】OR26 最长回文子串 NC369 [NOIP2002 普及组] 过河卒

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:刷题 ⚙️操作环境:牛客网 一.OR26 最长回文子串 牛客网题目链接(点击即可跳转):OR26 最长回文子串 题目详情: 本题详情如下图: 题目思路: 本题解题思路如下: 本题思路用中心扩展算法,遍历所有字符,将每个字符作为回文串…

批量删除或替换文本文件中指定的行,如删除第一行、删除最后一行

每一个文本文件中我们都可以插入非常多的行&#xff0c;我们可以对行的内容进行删除、修改等各种操作。如果文本文件中的某些行的内容需要更新&#xff0c;那我们就需要对其进行修改操作。想要修改文本文件的内容其实是非常方便的&#xff0c;但是如果想要批量的对多个文本文件…

LLM架构解析:词嵌入模型 Word Embeddings(第二部分)—— 从基础原理到实践应用的深度探索

本专栏深入探究从循环神经网络&#xff08;RNN&#xff09;到Transformer等自然语言处理&#xff08;NLP&#xff09;模型的架构&#xff0c;以及基于这些模型构建的应用程序。 本系列文章内容&#xff1a; NLP自然语言处理基础词嵌入&#xff08;Word Embeddings&#xff09…

机构数据服务

一、背景说明 券商/基金/银行等金融机构的数据中心&#xff0c;基本都外购有数十家各类数据&#xff0c;自有业务每天也在产生海量信息。如何有效管理和使用这些数据&#xff0c;通过数据服务&#xff0c;沉淀数据资产&#xff0c;机构研发和运维部门也在不断尝试和改进。 传…

中和农信:让金融“活水”精准浇灌乡村沃土

2025年政府工作报告首提“投资于人”概念&#xff0c;并22次提及“金融”&#xff0c;强调要着力抓好“三农”工作&#xff0c;深入推进乡村全面振兴&#xff1b;一体推进地方中小金融机构风险处置和转型发展&#xff1b;扎扎实实落实促进民营经济发展的政策措施&#xff0c;切…

JavaScript重难点突破:期约与异步函数

同步和异步 ​同步&#xff08;Synchronous&#xff09;​ ​定义&#xff1a;任务按顺序依次执行&#xff0c;前一个任务完成前&#xff0c;后续任务必须等待。 ​特点&#xff1a;阻塞性执行&#xff0c;程序逻辑直观&#xff0c;但效率较低 ​异步&#xff08;Asynchron…

学习总结 网格划分+瞬态求解设置

网格划分部分 1.导入几何文件 导入我们的几何模型&#xff0c;他的格式为.scdocx 2.添加局部尺寸BOI 因为要对对前缘和尾缘进行局部加密&#xff0c;所以进行一个BOI的局部加密&#xff0c;目标尺寸取的几何尺寸的最小尺寸的0.1&#xff0c;就是0.4mm。 3.生成表面网格 表面…

.NET 使用 WMQ 连接Queue 发送 message 实例

1. 首先得下载客户端&#xff0c;没有客户端无法发送message. 安装好之后长这样 我装的是7.5 安装目录如下 tools/dotnet 目录中有演示的demo 2. .Net 连接MQ必须引用bin目录中的 amqmdnet.dll 因为他是创建Queuemanager 的核心库&#xff0c; 项目中引用using IBM.WMQ; 才…

风电行业预测性维护解决方案:给风机装上 “智能医生”,实现故障 “秒级预警”

引言&#xff1a;风电设备故障为何成为 “运维黑洞”&#xff1f; 某海上风电场因齿轮箱轴承故障停机 3 天&#xff0c;直接损失 50 万元发电量。传统维护模式下&#xff0c;人工巡检覆盖率不足 40%&#xff0c;故障修复平均耗时 72 小时。而预测性维护通过物联网 AI 技术&am…