Leetcode—146. LRU 缓存【中等】(shared_ptr、unordered_map、list)

2024每日刷题(143)

Leetcode—146. LRU 缓存

在这里插入图片描述

先验知识

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

list & unordered_map 实现代码

struct Node{int key;int value;Node(int key, int value): key(key), value(value) {}
};class LRUCache {
public:LRUCache(int capacity): m_capacity(capacity) {}int get(int key) {// 不存在const auto it = map.find(key);if(it == map.cend()) {return -1;}// 存在const auto& listIt = it->second;// 还需要更新在cache中的位置cache.splice(cache.begin(), cache, listIt);return listIt->value;}void put(int key, int value) {// 存在该元素if(const auto it = map.find(key); it != map.cend()) {const auto& listIt = it->second;// 需要更新map中的valuelistIt->value = value;// 把元素移到list前面cache.splice(cache.begin(), cache, listIt);return; }// 不存在的情况// 判断cache的内存够不够if(cache.size() == m_capacity) {// 拿到cache中最后元素const Node& lastIt = cache.back(); // erase掉map中这个元素map.erase(lastIt.key);// cache中需要pop_back()cache.pop_back();}// 添加新元素cache.emplace_front(key, value);map[key] = cache.begin();}
private:const int m_capacity;list<Node> cache;unordered_map<int, list<Node>::iterator> map;
};/*** 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);*/

运行结果

在这里插入图片描述

unordered_map + shared_ptr 实现代码

struct Node{int key;int value;shared_ptr<Node> prev;shared_ptr<Node> next;Node(int key, int value): key(key), value(value) {}
};class LRUCache {
public:LRUCache(int capacity): m_capacity(capacity) {join(head, tail);}int get(int key) {const auto it = map.find(key);// 不存在if(it == map.cend()) {return -1;}// 存在shared_ptr<Node> &tarNode = it->second;// 更新其cache位置remove(tarNode);moveToHead(tarNode);return tarNode->value;}void put(int key, int value) {// 存在if(const auto it = map.find(key); it != map.cend()) {shared_ptr<Node>& node = it->second;// 更新值node->value = value;// 更新其所在cache的位置remove(node);moveToHead(node);return;}// 不存在// 先判断cache内存是否满if(map.size() == m_capacity) {// 拿到cache中最后元素shared_ptr<Node> lastNode = tail->prev;// 并删除cache中最后元素remove(lastNode);// 删除其在map中的位置map.erase(lastNode->key);}// cache中添加新元素moveToHead(make_shared<Node>(key, value));map[key] = head->next;}void join(shared_ptr<Node> node1, shared_ptr<Node> node2) {node1->next = node2;node2->prev = node1;}void remove(shared_ptr<Node> node) {join(node->prev, node->next);}void moveToHead(shared_ptr<Node> node) {join(node, head->next);join(head, node);}private:const int m_capacity;shared_ptr<Node> head = make_shared<Node>(-1, -1);shared_ptr<Node> tail = make_shared<Node>(-1, -1);unordered_map<int, shared_ptr<Node>> map;
};/*** 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/46674.shtml

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

相关文章

实战案例:用百度千帆大模型API开发智能五子棋

前随着人工智能技术的迅猛发展&#xff0c;各种智能应用层出不穷。五子棋作为一款经典的棋类游戏&#xff0c;拥有广泛的爱好者。将人工智能技术与五子棋结合&#xff0c;不仅能提升游戏的趣味性和挑战性&#xff0c;还能展现AI在复杂决策问题上的强大能力。在本篇文章中&#…

Elasticsearch:将Logstash日志存到elasticsearch中

配置Logstash # cat syslog02.conf #filename:syslog02.conf #注意这个是要用#号注释掉 input{file{path > ["/var/log/*.log"]} } output{elasticsearch {#建议将搜索引擎不要和应用部署到一台服务器&#xff0c;我们介绍就同台服务器hosts > ["192.168…

habase集群安装

解压到/opt/softs目录 tar -zxvf hbase-2.4.11-bin.tar.gz -C /opt/softs/ 改名 mv hbase-2.4.11/ hbase2.4.11 配置环境变量 修改/etc/profile vim /etc/profile 添加 #HBASE_HOME export HBASE_HOME/opt/softs/hbase2.4.11 export PATH$PATH:$HBASE_HOME/bin 修改其中的…

怎么把自己写的组件发布到npm官方仓库??

一.注册npm账号 npm官网 1.注册npm 账号 2.登陆 3.登陆成功 二.搭建一个vue 项目 具体步骤参考liu.z Z 博客 或者初始化一个vue项目 vue create XXX &#xff08;工程名字&#xff09;运行代码 npm run serve三.组件封装 1.在src文件下建一个package文件&#xff0…

深度学习计算机视觉中, 多尺度特征和上下文特征的区别是?

在深度学习和计算机视觉中&#xff0c;多尺度特征和上下文特征都是用来捕捉和理解图像中复杂模式和关系的重要概念&#xff0c;但它们的侧重点有所不同。 多尺度特征 (Multi-scale Features) 多尺度特征是指在不同尺度上对图像进行特征提取&#xff0c;以捕捉不同尺度的物体特…

借助 Aspose.Words,在 C# 中将 Word 转换为 JPG

有时我们需要将 Word 文档转换为图片&#xff0c;因为 DOC 或 DOCX 文件在不同设备上的显示可能会有所不同&#xff0c;但图像&#xff08;例如 JPG 格式&#xff09;在任何地方看起来都一样。 Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作…

基于深度学习的语音识别

基于深度学习的语音识别技术利用深度学习模型将语音信号转换为文本。这项技术在智能助理、自动字幕生成、电话客服系统、语音翻译等领域有着广泛的应用。以下是对这一领域的系统介绍&#xff1a; 1. 任务和目标 语音识别的主要任务和目标包括&#xff1a; 语音转文本&#x…

【OrangePi AIpro】: 探索AI加成的开源硬件魅力

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Orange Pi: 探索开源硬件的魅力引言Orange Pi概述OrangePi AIPro产品介绍试用体…

UDP传输文件和FTP传输文件

目录 UDP&#xff08;用户数据报协议&#xff09;: 实例代码&#xff1a; DatagramSocket&#xff1a; DatagramPacket&#xff1a; FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09; 实例代码&#xff1a; UDP&#xff08;用户数据报协议&…

—张pdf怎么分割成多页,怎么把一个pdf分割

在数字化时代&#xff0c;pdf文件已经成为我们工作和生活中不可或缺的一部分。然而&#xff0c;有时候我们可能会遇到需要将一张pdf文件分割成多页的情况。无论是为了便于分享&#xff0c;还是为了满足特定的文档格式要求&#xff0c;这个任务都可能变得相当棘手。但别担心&…

zookeeper+kafka消息队列群集部署

一、消息队列 1.消息队列 消息是应用间传送的数据 消息队列是应用见的通信方式&#xff0c;消息发送后立即返回&#xff0c;由消息系统确保消息可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取&#xff0c;消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发…

设计模式学习(二)工厂模式——抽象工厂模式+注册表

设计模式学习&#xff08;二&#xff09;工厂模式——抽象工厂模式注册表 前言使用简单工厂改进使用注册表改进参考文章 前言 在上一篇文章中我们提到了抽象工厂模式初版代码的一些缺点&#xff1a;①客户端违反开闭原则②提供方违反开闭原则。本文将针对这两点进行讨论 使用…

快速安装miniconda3和熟悉conda基本的操作

快速安装miniconda3和熟悉conda基本的操作 一、安装miniconda3 参考miniconda3官方网站 https://docs.anaconda.com/miniconda/安装环境 mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh…

CSS-0_3 CSS和单位

文章目录 CSS的值和单位属性值长度单位CSS和绝对单位CSS和相对单位百分比em & rem视口 颜色单位 碎碎念 CSS的值和单位 我们知道&#xff0c;CSS是由属性和属性值所组成的表 随着CSS的发展&#xff0c;属性不说几千也有几百&#xff0c;我从来不支持去背诵所有的可能性。…

昇思25天学习打卡营第22天|基于MindSpore的红酒分类实验

基于MindSpore的红酒分类实验 K近邻算法实现红酒聚类 1、实验目的 了解KNN的基本概念&#xff1b;了解如何使用MindSpore进行KNN实验。 2、K近邻算法原理介绍 K近邻算法&#xff08;K-Nearest-Neighbor, KNN&#xff09;是一种用于分类和回归的非参数统计方法&#xff0c;…

WPF 手撸插件 一

1、本文主要使不适用第三方工具&#xff0c;纯手工的WPF主项目加载另一个WPF的项目&#xff0c;这里我们加载的是*.exe。 2、项目结构如下图。AbstractionLayer用于创建插件的接口。WPFIPluginDemo是主程序。WpfPlugin3是要加载的插件程序。 3、 AbstractionLayer中添加接口IP…

机器学习——机器学习概述

机器学习——机器学习概述 1 什么是机器学习2 为什么使用机器学习3 常用术语和示例4 机器学习系统的类型4.1 有监督学习4.2 无监督学习4.3 半监督学习4.4 强化学习4.5 批量学习4.6 在线学习&#xff08;核外学习&#xff09;4.7 基于实例的学习4.8 基于模型的学习 5. 机器学习的…

flutter ios打包 xcode报错module ‘xxx‘ not found

flutter ios打包 xcode报错module ‘xxx’ not found 如果已经在androidstudio中成功运行了flutter build ios --release。 那么可能是你使用xcode打开的是ios/Runner.xcodeproj文件。 你关掉xcode&#xff0c;重新打开ios/Runner.xcworkspace/文件。然后重新archive&#xff…

【C++】P10287 [GESP样题 七级] 最长不下降子序列 题解_动态规划dp_图论_拓扑排序_洛谷_算法竞赛

P10287 [GESP样题 七级] 最长不下降子序列 题解 Link&#xff1a;Luogu - P10287 文章目录 P10287 [GESP样题 七级] 最长不下降子序列 题解题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示数据规模…

jvm常用密令、jvm性能优化、jvm性能检测、Java jstat密令使用、Java自带工具、Java jmap使用

1.jps是Java虚拟机的进程状态工具&#xff0c;用于列出正在运行的Java进程 jps命令的使用&#xff1a;cmd打开直接jps 1.1不带参数&#xff1a; jps 默认情况下&#xff0c;列出所有正在运行的 Java 进程的进程 ID 和主类名。 1.2 -l&#xff1a;显示完整的主类名或 JAR 文件…