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

LeetCode Hot100 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

思路

        双向链表维护头尾节点,用哈希表键值对寻找节点。

代码

class lrulist
{public:int val;int key;lrulist* next;lrulist* last;lrulist(int value, int k) : val(value), key(k), next(nullptr), last(nullptr){}
};
class LRUCache {
public:unordered_map<int, lrulist*> hashmap;lrulist* back;lrulist* front;int size;int cap;void push_front(int value, int key){lrulist* newnode = new lrulist(value, key);hashmap[key] = newnode;if(front){newnode->next = front;front->last = newnode;}elseback = newnode;front = newnode;++size;}void move(lrulist* node){if(node == front)return;if(back == node){back = back->last;if(back)back->next = nullptr;  }else{node->last->next = node->next;node->next->last = node->last; }node->next = front;if(front)front->last = node;front = node;}void del_node(lrulist* node){if(front == node){front = front->next;if(front)front->last = nullptr;}else if(back == node){back = back->last;if(back)back->next = nullptr;}hashmap.erase(node->key);--size;delete node;  }LRUCache(int capacity) : size(0), cap(capacity), front(nullptr), back(nullptr){}int get(int key) {if(hashmap.find(key) != hashmap.end()){move(hashmap[key]);return hashmap[key]->val;}elsereturn -1;}void put(int key, int value) {if(hashmap.find(key) == hashmap.end()){if(size == cap)del_node(back);push_front(value, key);}else{hashmap[key]->val = value;move(hashmap[key]);}}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Npm使用教程(详细讲解)
  • 算法打卡 Day19(二叉树)-平衡二叉树 + 二叉树的所有路径 + 左叶子之和 + 完全二叉树的节点个数
  • 【学习笔记】:Maven初级
  • 2024rk(案例三)
  • 【debian系统arm架构安装docker】且换源后依旧不行就离线导入镜像
  • c++修仙小游戏预告
  • 自动驾驶的一些大白话讲解
  • 分享一个学习数据结构的网站(美国就金山大学)
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • C++理解虚拟函数、多继承、虚基类和RTTI
  • CV党福音:YOLOv8实现语义分割
  • Redux
  • electron 无边框常用配置 实测 禁止缩放 设置大小 设置主副屏 关闭窗口 重启 主副进程联动 自动更新等
  • 分布式事务Seata的4种模式详解
  • ES6模块化简明笔记
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 07.Android之多媒体问题
  • canvas 高仿 Apple Watch 表盘
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CAP理论的例子讲解
  • download使用浅析
  • Git初体验
  • HTTP中GET与POST的区别 99%的错误认识
  • JavaScript HTML DOM
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaScript设计模式与开发实践系列之策略模式
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • tweak 支持第三方库
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • vue--为什么data属性必须是一个函数
  • webpack4 一点通
  • windows下mongoDB的环境配置
  • Xmanager 远程桌面 CentOS 7
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 阿里云前端周刊 - 第 26 期
  • 从重复到重用
  • 前言-如何学习区块链
  • 区块链分支循环
  • 全栈开发——Linux
  • 如何实现 font-size 的响应式
  • 算法---两个栈实现一个队列
  • 最简单的无缝轮播
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 积累各种好的链接
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ‌JavaScript 数据类型转换
  • ###STL(标准模板库)
  • #162 (Div. 2)
  • #传输# #传输数据判断#
  • $(function(){})与(function($){....})(jQuery)的区别
  • (13)DroneCAN 适配器节点(一)