【leetcode题解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

思路:无需多言,LRU是通过一个双向链表(有空的头、尾节点)和一个HashMap实现的,通过把最近使用过的节点放到链表头 ,然后在空间不足的时候剔除链表尾的节点来实现的。其中,HashMap主要用来记录一个节点是否存在,并提供用key来寻找对应节点相关数据的功能。

代码实现:

struct LinkedNode {int key_, value_;LinkedNode *prev;LinkedNode *next;LinkedNode(): key_(0), value_(0), prev(nullptr), next(nullptr) {}LinkedNode(int key, int value): key_(key), value_(value), prev(nullptr), next(nullptr) {}
};class LRUCache {
private:int size_, capacity_;LinkedNode *head;LinkedNode *tail;unordered_map<int, LinkedNode*> cache;public:LRUCache(int capacity): capacity_(capacity), size_(0) {head = new LinkedNode();tail = new LinkedNode();head->next = tail;tail->prev = head;}void put(int key, int value) {if(!cache.count(key)) { // 不存在这个页LinkedNode *node = new LinkedNode(key, value);cache[key] = node;addToHead(node);++size_;if(capacity_ < size_) {LinkedNode *LRU = removeFromTail();cache.erase(LRU->key_);delete LRU;--size_;}}else if(cache.count(key)) {LinkedNode *node = cache[key];node->value_ = value;moveToHead(node);}}int get(int key) {if(!cache.count(key)) { // 不存在这个页return -1;}else {LinkedNode *node = cache[key];moveToHead(node);return node->value_;}}void addToHead(LinkedNode *node) {head->next->prev = node;node->next = head->next;node->prev = head;head->next = node;}void removeNode(LinkedNode *node) {node->next->prev = node->prev;node->prev->next = node->next;}void moveToHead(LinkedNode *node) {removeNode(node);addToHead(node);}LinkedNode *removeFromTail() {LinkedNode *node = tail->prev;removeNode(node);return node;}
};

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

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

相关文章

Jmeter扩展开发--自定义java取样器

简介 jmeter内置了包括&#xff1a;http、https、tcp等各种协议的支持&#xff0c;通常情况只需要做简单的参数配置即可使用。但在某些特殊情况下&#xff0c;还是希望能做自定义压测处理&#xff0c;此时就涉及Jmeter的扩展开发自定义Java取样器&#xff0c;如下图所示&#…

基于centos7的k8s最新版v1.29.2安装教程

k8s概述 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态&#xff0c;其服务、支持和工具的使用范围相当广泛。 Kubernetes 这个名字源于希腊语&…

分布式微服务 - 4.服务增强 - 1.概念

分布式微服务 - 4.服务增强 - 1.概念 项目示例&#xff1a; 无 内容提要&#xff1a; 配置中心、框架 文档&#xff1a; 无 配置中心 随着需求的不断开发实现&#xff0c;系统逐渐庞大&#xff0c;微服务逐渐增多&#xff0c;系统涉及到的配置信息不断增多&#xff0c;…

Github主页设置贪吃蛇详细教程

先看最终实现结果&#xff1a; 有条贪吃蛇放在主页还是蛮酷的哈哈哈。接下来我来讲一讲怎么在Github主页添加一条贪吃蛇。 首先要修改自己的Github的主页&#xff0c;我们得有一个特殊的仓库——这个仓库必须与你的Github用户名保持一致&#xff0c;并且需要公开&#xff0c…

力扣日记3.14-【贪心算法篇】376. 摆动序列

力扣日记&#xff1a;【贪心算法篇】376. 摆动序列 日期&#xff1a;2024.3.14 参考&#xff1a;代码随想录、力扣 376. 摆动序列 题目描述 难度&#xff1a;中等 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;…

【JavaEE】网络原理-HTTPS

网络原理-HTTPS 1. HTTPS是什么 HTTPS是在应用层上的协议&#xff0c; 基于HTTP进行加密 HTTP协议内容都是按照文本内容进行明文传输&#xff0c;容易使得内容被“劫持”。 十年前&#xff0c;经常有下载链接被劫持&#xff0c;就会产生下载图片和下载链接不是一个产品的现象…

python毕业设计基于flask应急救援调度系统django

此系统设计主要采用的是python语言来进行开发&#xff0c;采用flask框架技术&#xff0c;框架分为三层&#xff0c;分别是控制层Controller&#xff0c;业务处理层Service&#xff0c;持久层dao&#xff0c;能够采用多层次管理开发&#xff0c;对于各个模块设计制作有一定的安全…

docker日志在哪看?怎么在Linux服务器中查看日志

Docker 日志主要分为两类&#xff0c;一类是Docker 引擎日志&#xff0c;另一类是容器日志。具体如下&#xff1a; Docker 引擎日志&#xff1a;这些日志记录了 Docker 引擎本身的操作信息&#xff0c;其位置依赖于使用的操作系统。例如&#xff0c;在 Ubuntu 14.04 中&#x…

Tengine 的xquic,如何适配四层负载的udp健康检查?

为什么要适配udp健康检查&#xff1f; Tengine通过xquic实现HTTP3协议&#xff0c;不同于HTTP2和HTTP1.1以及之前的HTTP协议&#xff0c;HTTP3最大的不同就是其传输层协议由TCP改成了基于UDP实现的QUIC协议。QUIC 协议实现在用户态&#xff0c;建立在内核态的 UDP 的基础之上&…

【投稿优惠-EI稳定检索】2024年图像处理与机械系统工程国际学术会议 (ICIPMSE 2024)

【投稿优惠-EI稳定检索】2024年图像处理与机械系统工程国际学术会议 (ICIPMSE 2024) 大会主题: (主题包括但不限于, 更多主题请咨询会务组苏老师) 图像处理 基于图像的渲染 计算机视觉 可视化分析 模式识别 3D打印 渲染和动画 渲染技术 电脑动画 基于草图的建模 机械…

IT领域的未来发展趋势与挑战

IT行业作为当今世界最具活力和创新性的领域之一&#xff0c;持续地塑造着我们的生活和工作方式。在未来&#xff0c;IT领域将继续迎来许多重要的发展趋势和挑战&#xff0c;这些趋势将引领着技术的发展方向&#xff0c;而挑战则需要我们找到有效的解决方案。 1. 人工智能&…

苹果Find My App用处多多,产品认准伦茨科技ST17H6x芯片

苹果发布AirTag发布以来&#xff0c;大家都更加注重物品的防丢&#xff0c;苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch&#xff0c;如今的Find My已经不单单可以查找苹果的设备&#xff0c;随着第三方设备的加入&#xff0c;将丰富Find My Network的版图。产…

Unity Timeline学习笔记(2) - PlayableTrack

PlayableTrack 是可自定义播放的轨道。我们可以通过进入轨道后调用自己的函数方法&#xff0c;使用起来也是比较顺手的。 添加轨道 我们点击加号添加 这样就有一个空轨道了&#xff0c;然后我们创建两个测试脚本。 添加脚本 分别是Playable Behaviour和PlayableAsset脚本。…

unity报错出现Asset database transaction committed twice!

错误描述&#xff1a; 运行时报错 Assertion failed on expression: ‘m_ErrorCode MDB_MAP_RESIZED || !HasAbortingErrors()’Asset database transaction committed twice!Assertion failed on expression: ‘errors MDB_SUCCESS || errors MDB_NOTFOUND’ 解决办法&…

MySQL:概念简章

1.SQL通用语法 SQL单行、多行书写&#xff0c;以分号结尾SQL可以以空格有缩进增加代码可读性SQL语句不区分大小写 2.SQL语句分类 2.1 DDL&#xff08;数据定义语言&#xff09; 用于数据库、数据表、字段的定义的语言 create by 表名 &#xff08;表里有什么字段&#xff09;…

Hive中的CONCAT、CONCAT_WS与COLLECT_SET函数

1.CONCAT与CONCAT_WS函数 1.1 CONCAT函数 -- concat(str1, str2, ... strN) - returns the concatenation of str1, str2, ... strN or concat(bin1, bin2, ... binN) - returns the concatenation of bytes in binary data bin1, bin2, ... binN Returns NULL if any argum…

幼儿园管理系统|基于springboot框架+ Mysql+Java+Tomcat的幼儿园管理系统设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 用户功能模块 管理员功能登录前台功能效果图 教师功能模块 系统功能设计 数据库E-R图设计 lunwen参…

项目安全保证措施word

软件系统做项目安全保证措施的原因有以下几点&#xff1a; 保护数据安全&#xff1a;通过安全措施可以保护数据不被非法获取、篡改或损坏。 保障系统稳定&#xff1a;安全措施可以减少系统受到的威胁&#xff0c;确保系统的稳定运行。 符合法律法规&#xff1a;为了遵守国家和地…

蓝桥杯单片机快速开发笔记——定时器

一、基本原理&#xff1a; 定时器的作用&#xff1a; 定时器是一种用于产生精确时间延时的模块&#xff0c;可以在程序中用来进行时间控制、计时等操作。 定时器的工作原理&#xff1a; 51单片机的定时器是通过内部的计数器来实现的&#xff0c;计数器每隔一个固定的时间周期自…

【AIGC调研系列】Github Copilot进行pytest自动化测试的实践经验

GitHub Copilot可以用于pytest自动化测试的实践和使用方法。此外&#xff0c;Copilot可以在很多情况下仅通过注释或函数名就能实例化出完整的代码&#xff0c;这表明它也可以用于补充测试用例[5]。 具体到pytest框架&#xff0c;它是一个非常容易上手的自动化测试框架&#xf…