力扣146 - LRU缓存

视频讲解

哈希 + 双向链表

为什么要用双向链表?

快速删除节点(O(1))

如果是单链表的话,删除一个节点时,需要从头遍历,找到前驱节点,才能修改 prev->next,导致 O(n) 的时间复杂度

双向链表存储了两个指针,一个指针指向下一个节点,另一个指针指向上一个节点(前驱指针)。所以我们可以根据前驱指针快速找到上一个节点,然后移除掉当前节点。

demo:

class LRUCache {
public:struct Node{int key,val;Node *prev,*next;Node(int k,int v) : key(k) , val(v) , prev(nullptr) , next(nullptr){}};map<int,Node*>mp;Node *L,*R; //双哨兵int n; //LRU的总数//创建操作LRUCache(int capacity) {n = capacity;L = new Node(-1,-1);R = new Node(-1,-1);L->next = R;R->prev = L;}//获取值操作 (获得值的时候需要注意:如果有值存在哈希表中的话,那么就要将这个值放在最新的地方)//比如: L | 2 1 4 | R //我们查询1这个数,那么查完后需要变成: L | 2 4 1 | R int get(int key) {if(mp.count(key)){Node* node = mp[key];remove(node); //在链表中移除该节点 通过双向指针移除insert(node->key,node->val); // 在链表中插入该节点return node->val;}else{return -1;}}//插入操作void put(int key, int value) {if(mp.count(key)){Node* node = mp[key];remove(node);insert(key,value); //这里需要用给的key和value而不是node->key和node->val(因为可能插入的是新的值)}else{if(mp.size() == n){Node* node = L->next; //满了,需要移除的节点remove(node);insert(key,value);}else{insert(key,value);}}}//以下为自定义新增函数 remove是移除节点的函数 insert是插入节点的函数//同时在链表和哈希表中删除nodevoid remove(Node* node){Node* pre = node->prev;Node* nxt = node->next;pre->next = nxt;nxt->prev = pre;mp.erase(node->key);}//同样要同时操作链表和哈希表void insert(int key,int val){Node* node = new Node(key,val);Node* pre = R->prev;//这里是最后一个插入的数//向右pre->next = node;node->next = R;//向左node->prev = pre;R->prev = node;mp[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);*/

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

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

相关文章

考研408

是否需要考研&#xff1f; 考研前期准备 目标院校 每年9月10月才会公布 考试时长3小时 数据结构 1.时间复杂度选择题计算 2.顺序表链表特点;指针、结构体语法&#xff0c;链表结点定义&#xff0c;链表头结点与头指针,常见的五种链 表&#xff0c;链表的插入删除操作;顺…

nodejs使用WebSocket实现聊天效果

在nodejs中使用WebSocket实现聊天效果&#xff08;简易实现&#xff09; 安装 npm i ws 实现 创建 server.js /*** 创建一个 WebSocket 服务器&#xff0c;监听指定端口&#xff0c;并处理客户端连接和消息。** param {Object} WebSocket - 引入的 WebSocket 模块&#xff0c…

Web网页制作(静态网页):千年之恋

一、是用的PyCharm来写的代码 二、代码中所用到的知识点&#xff08;无 js&#xff09; 这段HTML代码展示了一个简单的注册页面&#xff0c;包含了多个HTML元素和CSS样式的应用。 这段HTML代码展示了一个典型的注册页面&#xff0c;包含了常见的HTML元素和表单控件。通过CSS样…

操作系统知识点23

1.实时操作系统的主要设计目标&#xff1a;在严格时间氛围内对外部请求做出反应。 2.当用户程序正在处理器上运行时&#xff0c;若此刻取到了一条特权指令&#xff0c;则处理器将停止执行该指令&#xff0c;并产生一个“非法操作”的事件 3.某网络监控系统中。多个被授权的用…

CSS—网格布局Grid

网格布局grid 提供了带有行和列的基于网格的布局系统&#xff0c;无需使用浮动和定位。 当 HTML 元素的 display 属性设置为 grid 或 inline-grid 时&#xff0c;它就会成为网格容器。 更多布局模式可以参考之前的博客&#xff1a; ​​​​​​CSS—flex布局、过渡transit…

如何将本地已有的仓库上传到gitee (使用UGit)

1、登录Gitee。 2、点击个人头像旁边的加号&#xff0c;选择新建仓库&#xff1a; 3、填写仓库相关信息 4、复制Gitee仓库的地址 5、绑定我们的本地仓库与远程仓库 6、将本地仓库发布&#xff08;推送&#xff09;到远程仓库&#xff1a; 注意到此处报错&#xff0c;有关于…

【JAVA面试题】Spring、Spring MVC、Spring Boot、Spring Cloud的区别与联系

在Java生态中&#xff0c;Spring框架及其衍生技术&#xff08;如Spring MVC、Spring Boot、Spring Cloud&#xff09;是开发企业级应用的核心工具。它们在功能、定位和使用场景上各有侧重&#xff0c;但又紧密联系。本文将详细解析它们的区别与联系&#xff0c;帮助你在面试中更…

【Linux系统编程】初识系统编程

目录 一、什么是系统编程1. 系统编程的定义2. 系统编程的特点3. 系统编程的应用领域4. 系统编程的核心概念5. 系统编程的工具和技术 二、操作系统四大基本功能1. 进程管理&#xff08;Process Management&#xff09;2. 内存管理&#xff08;Memory Management&#xff09;3. 文…

Web基础:HTML快速入门

HTML基础语法 HTML&#xff08;超文本标记语言&#xff09; 是用于创建网页内容的 标记语言&#xff0c;通过定义页面的 结构和内容 来告诉浏览器如何呈现网页。 超文本&#xff08;Hypertext&#xff09; 是一种通过 链接&#xff08;Hyperlinks&#xff09; 将不同文本、图像…

Linux基本操作指令3

1、wget: 这是一个用于从网络上下载文件的命令行工具。它支持 HTTP、HTTPS 和 FTP 协议。 wget http://download.qt.io/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run 2、下载完成后&#xff0c;你可以通过以下命令使文件可执行并运行安装程序&#xff1a; ch…

Deeplabv3+改进3:在主干网络中添加NAMAttention|助力涨点!

🔥【DeepLabv3+改进专栏!探索语义分割新高度】 🌟 你是否在为图像分割的精度与效率发愁? 📢 本专栏重磅推出: ✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化 ✅ 即插即用模块:ASPP+升级、解码器 PS:订阅专栏提供完整代码 目录 论文简介 步骤一 步骤二…

二分查找(递归和迭代)– Python

1. 使用递归进行二分查找的 Python 程序 创建一个递归函数&#xff0c;并将搜索空间的 mid 与 key 进行比较。根据结果&#xff0c;要么返回找到键的索引&#xff0c;要么调用下一个搜索空间的递归函数。 # 用于递归二进制搜索的 Python 3 程序。 # 在注释中可以找到对旧版 Pyt…

电力场景绝缘子缺陷分割数据集labelme格式1585张4类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;1585 标注数量(json文件个数)&#xff1a;1585 标注类别数&#xff1a;4 标注类别名称:["broken part","broken insulat…

部署说明书

一、打开IIS功能 1、 双击“此电脑” 2、 在空白地方右键后&#xff0c;点击属性 3、 点击控制面板主页 4、 查看方式选择小图标&#xff0c;然后点击”程序和功能” 5、点击”启用或关闭Windows功能” 6、 勾选”Internet Information Services”勾选“IIS管理服务…

在vue2项目中el-table表格的表头和内容错位问题

一、问题描述以及产生原因 问题描述&#xff1a;当el-table表格有横向滚动条和纵向滚动条&#xff0c;把横向滚动条拉到最右边&#xff0c;表格的表头会和内容错位&#xff08;表头和内容列不对齐&#xff09;问题产生原因&#xff1a;在el-table有纵向滚动条时&#xff0c;el…

《基于深度学习的图像修复技术研究与应用-图像修复》—3000字论文模板

摘要(500字) (扩展方向:补充具体技术指标与创新点量化描述) 本文针对图像修复技术展开研究,重点探讨了基于深度学习的方法在图像修复领域的应用。研究首先回顾了传统图像修复技术,随后深入分析了深度学习在图像修复中的优势。本文提出了一种改进的深度学习图像修复模型…

基于Python+Vue的智能服装商城管理系统的设计与实现

&#x1f457; 基于PythonVue的智能服装商城管理系统的设计与实现 电商级解决方案&#xff1a;全栈技术融合 智能推荐系统 多维度数据分析 项目亮点&#xff1a;课程设计优选 | 企业级架构规范 | 完整电商功能闭环 | 毕业设计选择 &#x1f310; 在线资源速览 类别地址访问方…

【二】JavaScript能力提升---this对象

目录 this的理解 this的原理 事件绑定中的this 行内绑定 动态绑定 window定时器中的this 相信小伙伴们看完这篇文章&#xff0c;对于this的对象可以有一个很大的提升&#xff01; this的理解 对于this指针&#xff0c;可以先记住以下两点&#xff1a; this永远指向一个…

使用vue3.0+electron搭建桌面应用并打包exe

使用vue3.0electron搭建桌面应用并打包exe_如何使用electron将vue3vite开发完的项目打包成exe应用程序-CSDN博客

linux如何判断进程对磁盘是随机写入还是顺序写入?

模拟工具&性能测试工具&#xff1a;fio fio参数说明&#xff1a; filename/dev/sdb1&#xff1a;测试文件名称&#xff0c;通常选择需要测试的盘的data目录。 direct1&#xff1a;是否使用directIO&#xff0c;测试过程绕过OS自带的buffer&#xff0c;使测试磁盘的结果更真…