leetcode 146.LRU 缓存

news/2024/11/16 11:41:00/

题目链接:leetcode 146

1.题目

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。
函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

2.示例

1)示例:
输入
[“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

2)提示:
1 <= capacity <= 3000
0 <= key <= 10000
0 <= value <= 105
最多调用 2 * 105 次 get 和 put

3.分析

虽然这道题思路不难想,但是细节真的好多,我看着我的提交记录陷入了沉思,真的应该给hard难度啊。。。
题目要求我们使用数据结构将映射的key和value存储下来,同时要求:
1)有内存限制,不能无限添加
2)添加和查询都是O(1)的操作
3)添加和查询都会让这个key值的优先级变得最高
4)当内存都被使用,又需要插入操作时,就需要删除掉优先级最低的key值
那么根据上述的描述,我们应该分别使用map和一个链表类来进行存储,需要注意的点有:
1)删除和添加改变节点间关系的时候都需要特判节点是不是空指针
2)链表节点类记得声明public
3)put 和get都需要把查询和添加的key值移到链表的尾部

4.代码

class ListNode1{public:int K,V;ListNode1* next,*la;ListNode1(int key,int val){K=key;V=val;next=NULL;la=NULL;}
};
class LRUCache {
public:map<int,ListNode1*> map1;int num=0,num1=0;ListNode1* head,*last;LRUCache(int capacity) {num=capacity;head=new ListNode1(0,0);last=head;}void make_piar(ListNode1* x,ListNode1* y){x->next=y;if(y!=NULL) y->la=x;}int get(int key) {if(map1.count(key)){ListNode1* m=map1[key]->la,*n=map1[key]->next;if(map1[key]!=last){make_piar(m,n);make_piar(last,map1[key]);}last=map1[key];return map1[key]->V;}// return (head->next)->K;return -1;}void put(int key, int value) {if(map1.count(key)){map1[key]->V=value;ListNode1* m=map1[key]->la,*n=map1[key]->next;if(map1[key]!=last){make_piar(m,n);make_piar(last,map1[key]);}last=map1[key];}else{if(num1!=num){ListNode1* n=new ListNode1(key,value);make_piar(last,n);last=n;num1++;map1[key]=n;}else{map<int,ListNode1*>::iterator iter=map1.find((head->next)->K);map1.erase(iter);ListNode1* n=new ListNode1(key,value);make_piar(last,n);map1[key]=n;last=n;ListNode1* m=(head->next)->next;make_piar(head,m);}}}
};

能AC 真的很不容易就是说。。。
请添加图片描述


http://www.ppmy.cn/news/84083.html

相关文章

ubuntu安装ros FULL完全版

UBUNTU安装ROS_FULL完全版 1/ 修改安装源URL Setup your sources.list Setup your computer to accept software from packages.ros.org. sudo sh -c ‘. /etc/lsb-release && echo “deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ lsb_release -cs main” &g…

Servlet 和 SpringBoot 优缺点对比

Servlet 项目开发 和 Servlet 项目开发 Servlet 痛点分析&#xff08;重点&#xff09;2.2 SpringBoot 项⽬开发2.2.2 添加代码并运⾏程序2.2.3 发布程序 2.2.4 SpringBoot VS Servlet 本篇进行servlet开发和 SpringBoot 项目开发 引出 JavaEE 进阶框架 的学习 Servlet 项目开…

一篇文章告诉你怎样优化shopee的产品标题、主图、描述?

很多人都听过“七分选品&#xff0c;三分运营”这句话&#xff0c;选品固然很重要&#xff0c;但是我们也不能忽略了后面的运营。有好的选品作为基础之后&#xff0c;我们就要去用运营来锦上添花。而运营里面很重要的一步就是产品优化&#xff0c;包括对于产品标题、关键词、详…

西门子物联网网关 IOT2050 杭州乐芯生态合作版 LX-IOT2050

西门子物联网网关 IOT2050 乐芯生态合作版 LX-IOT2050 •基于 IOT2050 硬件基础上安装了乐芯科技数据采集引擎&#xff0c; 提供开箱即用的物联网解决方案。 •硬件&#xff1a;基于西门子工业的高品质硬件&#xff0c;完善的国际认证资质 &#xff0c; 欧盟CE、UL、CCC认证。…

5种易实现的Linux和 Windows VPS速度提升方法

​  无论是Linux VPS还是Windows VPS&#xff0c;网站速度的提高都是非常重要的。它们在提高网站速度方面都有很多的优化方法。下面我们将介绍 5 种提高网站速度的方法。 1.通过缓存加速 缓存通常是用来加快商业网站加载时间的技术&#xff0c;因此它也可以用在 VPS 上。没有…

电磁频谱异常监测论文阅读 | 《战场电磁环境下的电磁频谱管控指标体系研究》

文章目录 1.《战场电磁环境下的电磁频谱管控指标体系研究》1.1 电磁频谱管控的基本概念:1.2 电磁频谱管控的主要内容:1.3 指标体系1.3.1 技术指标体系1.3.2 战术指标体系1.《战场电磁环境下的电磁频谱管控指标体系研究》 1.1 电磁频谱管控的基本概念: 频谱管控是指军队领导…

柔顺机构学读书笔记2:欧拉伯努利梁

对于末端受力矩弯曲的梁来说&#xff0c;欧拉伯努利方程为&#xff1a; d θ d s M 0 E I \frac{\mathrm{d} \theta}{\mathrm{d} s}\frac{M_{0}}{E I} dsdθ​EIM0​​ 这其实是建立在小变形的基础上&#xff0c;否则曲率不是这么简单的。在这种情况下我们可以计算末端的变形…

Elasticsearch:了解和解决文档更新后 Elasticsearch 分数的变化

问题 问卷中有如下这样的文档&#xff0c;开发者想通过 match query 搜索这些文档来使用分数。 POST sample-index-test/_doc/1 {"first_name": "James","last_name" : "Osaka" } 以下是对上述文档的示例查询&#xff1a; GET sam…