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

链表OJ(十六)146. 模拟LRU 缓存 双向链表+哈希

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 ,则应该 逐出 最久未使用的关键字。

函数 getput 必须以 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
struct Node {Node* next;            出错点1:把指针定义成了 int*Node* pre;int key;int value;Node(int k = 0, int v = 0) {key = k;value = v;next = nullptr;pre = nullptr;}
};class LRUCache {
private:int capacity;Node* dummy = new Node();unordered_map<int, Node*> hash_node;// 在链表中寻找结点Node* Find_Node(int key) {if (hash_node.find(key) != hash_node.end()) {return hash_node[key];} elsereturn dummy;}// 将该cur元素移动至末尾void Get_back(Node* cur) {cur->pre = dummy->pre;dummy->pre->next = cur;dummy->pre = cur;cur->next = dummy;    出错点2:忘记给哈希表中进行处理// 插入元素的时候也要给哈希表中进行插入    hash_node.insert(pair<int, Node*> (cur->key, cur));}void Delete_Node(Node* cur){cur->next->pre = cur->pre;cur->pre->next = cur->next;// 删除元素的时候也要给哈希表中进行删除hash_node.erase(cur->key);}public:LRUCache(int c) : capacity(c) {dummy->pre = dummy;dummy->next = dummy;}int get(int key) {// 1、在双向链表中找到这个元素Node* cur = Find_Node(key);if (cur != dummy) {// 2、更新这对元素到末尾位置Delete_Node(cur);Get_back(cur);return cur->value;              出错点3:指针的访问使用箭头……}return -1;}void put(int key, int v) {// 1、在双向链表中寻找这个元素Node* cur = Find_Node(key);if (cur != dummy) {// 2、如果已经存在,则修改它的value,并尾插Delete_Node(cur);cur->value = v;Get_back(cur);}else{// 3、不存在的话,尾插这个新元素对cur = new Node(key, v);Get_back(cur);capacity--;if(capacity < 0){// 在有新插入情况下,访问容量是否大于capacity,如果超过,头删一个元素。Delete_Node(dummy->next);capacity++;}}}
};/*** Your LRUCache object will be instantiated and called as such:* LRUCache* obj = new LRUCache(capacity);* int param_1 = obj->get(key);* obj->put(key,value);*/

http://www.dtcms.com/a/470074.html

相关文章:

  • 旧物新生:一款回收小程序如何让环保成为举手之劳
  • seo网站优化服务去哪个网站找题目给孩子做
  • MATLAB实现对角加载波束形成算法
  • 从嵌入式到社区物联网:基于Pegasus智能家居套件的全栈实验方案
  • Vue + Spring Boot 实现 Excel 导出实例
  • 服务器关闭 网站被kseo搜索引擎优化策略
  • 【Android】六大设计原则
  • 液压位置控制源代码实现与解析(C语言+MATLAB联合方案)
  • 技术拆解:基于成品源码的海外外卖跑腿平台部署指南
  • 宽城网站制作山东网站建设网站
  • 申论素材学习笔记-把握好人才工作辩证法
  • 深度学习入门(三)——优化算法与实战技巧
  • 最新短视频AI智能营销询盘获客系统源码及搭建教程 源码开源可二次开发
  • 易优cms仿站教程wordpress文章搜索排序
  • 什么网站能免费做简历wordpress汉字注册
  • 喜报!网易灵动荣获2025全球数贸创新大赛机器人赛道金奖
  • AI IDE/插件(二)
  • 一文掌控系统网络性能:Linux环境时延与带宽测试指南
  • Effective Python 第44条:用纯属性与修饰器取代旧式的 setter 与 getter 方法
  • 中国网站排名站长之家有哪些好玩的网页游戏
  • 从零开始:Godot打造2D像素冒险游戏
  • 全球十大互联网企业深圳网站设计专家乐云seo品牌
  • 如何进行后端开发:一个详细指南
  • 基于Spring Boot的酒店管理系统
  • 怎么用腾讯云服务器做网站建个人网站做导购怎么备案
  • 单页面网站设计有人做网站吗
  • 编程与数学 03-007 《看潮资源管理器》项目开发 03 技术选型
  • LeetCode每日一题,20251011
  • Linux c 在内存中创建zip,最后写入测试
  • 做品牌推广用什么网站眉山网站开发