当前位置: 首页 > news >正文

【C++】每日一题 146 LRU缓存

请你设计并实现一个满足 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) 的平均时间复杂度运行。

示例:

输入
[“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

336ms

typedef struct LRUnode{int key, value;struct LRUnode* prev;struct LRUnode* next;LRUnode():key(0),value(0),prev(NULL),next(NULL){};LRUnode(int key, int value):key(key),value(value),prev(NULL),next(NULL){};
}LRUnode;class LRUCache {
private:unordered_map<int,LRUnode*> m;LRUnode *head;LRUnode *tail;int size;int capacity;public:LRUCache(int capacity):capacity(capacity),size(0) {head = new LRUnode();tail = new LRUnode();head->next = tail;tail->prev = head;}int get(int key) {     int ret;auto it = m.find(key);if(it != m.end()){          ret = it->second->value;it->second->next->prev = it->second->prev;it->second->prev->next = it->second->next;it->second->next=head->next;it->second->prev = head;head->next->prev = it->second;head->next = it->second;}else{ret = -1;}return ret;}void put(int key, int value) { auto it = m.find(key);if(it!=m.end()){it->second->value = value;it->second->next->prev = it->second->prev;it->second->prev->next = it->second->next;it->second->next=head->next;it->second->prev = head;head->next->prev = it->second;head->next = it->second;}else{LRUnode *newNode = new LRUnode(key,value);m.insert(make_pair(key,newNode));newNode->next = head->next;head->next->prev = newNode;newNode->prev = head;head->next = newNode;size++;if(size>capacity){LRUnode *delNode = tail->prev;//tail->prev->prev = tail;tail->prev = tail->prev->prev;tail->prev->next = tail;size--;m.erase(delNode->key);delete delNode;}}}
};
http://www.lryc.cn/news/317542.html

相关文章:

  • CentOS搭建NAS服务器并使用
  • 爬虫入门到精通_框架篇16(Scrapy框架基本使用)_名人名言的抓取
  • mac inter 芯片遇到程序无法打开(无法验证开发者)
  • 科技成果鉴定测试如何进行?第三方检测机构进行鉴定测试的好处
  • 八、词嵌入语言模型(Word Embedding)
  • 重学SpringBoot3-WebMvcConfigurer接口
  • 《深入理解springCloud与微服务》笔记
  • Vivado原语模板
  • 【linux本地安装tinycudann包教程】
  • 使用Nginx进行负载均衡
  • 什么护眼台灯效果好?热门护眼台灯全方位测评推荐
  • 云上三问,迈向智能时代的关键
  • 【网络安全】手机不幸被远程监控,该如何破解,如何预防?
  • 每日OJ题_哈希表④_力扣219. 存在重复元素 II
  • 42.坑王驾到第八期:uniCloud报错
  • Linux常用操作命令
  • OpenCV的常用数据类型
  • STM32串口通信—串口的接收和发送详解
  • 《汇编语言》第3版 (王爽) 第14章
  • Axure原型设计项目效果 全国职业院校技能大赛物联网应用开发赛项项目原型设计题目
  • 力扣串题:字符串中的第一个唯一字母
  • 【五、接口自动化测试】GET/POST 请求区别
  • HDOJ 2036
  • 2.案例、鼠标时间类型、事件对象参数
  • OPENCV(0-1之0.0)
  • easyrecovery破解版百度云(含Mac/Win版)以及EasyRecovery可以恢复哪些设备
  • [2023年]-hadoop面试真题(一)
  • Kubernetes kafka系列 | k8s部署kafka+zookeepe集群
  • ip广播智慧工地广播喊话号角 IP网络号角在塔吊中应用 通过寻呼话筒预案广播
  • B端系统优化,可不是换个颜色和图标,看看与大厂系统的差距。