【力扣刷题练习】146. LRU 缓存

2024-01-19 02:36
文章标签 力扣 练习 缓存 刷题 lru 146

本文主要是介绍【力扣刷题练习】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) 的平均时间复杂度运行。

题目解答:

class LRUCache {  
private:  // 缓存容量  int cap;  // 缓存项列表,每个缓存项是一个键值对  list<pair<int, int>> cache;  // 哈希表,用于存储键到缓存项迭代器的映射  unordered_map<int, list<pair<int, int>>::iterator> map;  public:  // 构造函数,接受一个整数参数capacity,表示缓存容量  LRUCache(int capacity) {   cap = capacity; // 初始化缓存容量  }  // 获取指定键的值,如果键不存在则返回-1  int get(int key) {  auto it = map.find(key); // 在哈希表中查找键  if (it == map.end()) // 如果键不存在于哈希表中  return -1; // 返回-1表示键不存在  cache.splice(cache.begin(), cache, it->second); // 将对应的缓存项移到列表前端  return it->second->second; // 返回键对应的值  }  // 将键值对添加到缓存中,如果键已存在则更新其值,如果缓存已满则删除最少使用的缓存项  void put(int key, int value) {  auto it = map.find(key); // 在哈希表中查找键  if (it != map.end()) { // 如果键已存在于哈希表中  cache.splice(cache.begin(), cache, it->second); // 将对应的缓存项移到列表前端,以便更新值  it->second->second = value; // 更新键对应的值  return; // 结束函数调用  }  if (cache.size() == cap) { // 如果缓存已满  map.erase(cache.back().first); // 从哈希表中删除最少使用的缓存项的键  cache.pop_back(); // 从列表中删除最少使用的缓存项  }  cache.push_front({key, value}); // 在列表前端添加新的缓存项  map[key] = cache.begin(); // 在哈希表中添加键到缓存项迭代器的映射  }  
};

题目思路:

全文背诵并默写
按照题目给的板子去实现了LRU缓存的基本功能:能够快速获取指定键的值,并在缓存已满时删除最少使用的缓存项。通过使用双向链表和哈希表,该实现能够在常数时间内完成获取、插入和删除操作,从而提供高效的缓存管理。

这篇关于【力扣刷题练习】146. LRU 缓存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/621028

相关文章

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

PyCharm如何更改缓存位置

《PyCharm如何更改缓存位置》:本文主要介绍PyCharm如何更改缓存位置的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm更改缓存位置1.打开PyCharm的安装编程目录2.将config、sjsystem、plugins和log的路径

JSR-107缓存规范介绍

《JSR-107缓存规范介绍》JSR是JavaSpecificationRequests的缩写,意思是Java规范提案,下面给大家介绍JSR-107缓存规范的相关知识,感兴趣的朋友一起看看吧... 目录1.什么是jsR-1072.应用调用缓存图示3.JSR-107规范使用4.Spring 缓存机制缓存是每一

Spring 缓存在项目中的使用详解

《Spring缓存在项目中的使用详解》Spring缓存机制,Cache接口为缓存的组件规范定义,包扩缓存的各种操作(添加缓存、删除缓存、修改缓存等),本文给大家介绍Spring缓存在项目中的使用... 目录1.Spring 缓存机制介绍2.Spring 缓存用到的概念Ⅰ.两个接口Ⅱ.三个注解(方法层次)Ⅲ.

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Spring三级缓存解决循环依赖的解析过程

《Spring三级缓存解决循环依赖的解析过程》:本文主要介绍Spring三级缓存解决循环依赖的解析过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、循环依赖场景二、三级缓存定义三、解决流程(以ServiceA和ServiceB为例)四、关键机制详解五、设计约

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓