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

力扣HOT100之链表:146. LRU 缓存


这道题从来没做过,完全不知道该怎么写,直接去看视频了,感觉这个视频讲解的挺好的。
这道题主要是需要自己额外定义数据结构和函数,需要定义节点结构体,用于存放键值对,每个节点都有前后指针,所以这道题是采用哈希表+双向链表的做法来做的。这道题添加和删除节点的逻辑都很好理解,最难想到的就是当插入节点,但缓存已满时,如何找到最久未使用的节点,这个实现起来不难,每一次插入节点都从头部插入,不常使用的节点总是在链表的最末端,所以我们只需要将末端的节点删除即可。

//定义节点
struct Node{int key, val;Node *pre, *next;Node() : key(0), val(0), pre(nullptr), next(nullptr){}Node(int _key, int _val) : key(_key), val(_val), pre(nullptr), next(nullptr){}
};class LRUCache {
public:Node *head, *tail;   //双向链表的头节点和尾节点unordered_map<int, Node*> hash;    //内部维护一个哈希表int capacity, size;   //容量和当前元素个数LRUCache(int _capacity) {capacity = _capacity;size = 0;head = new Node();tail = new Node();head -> next = tail;tail -> pre = head;}int get(int key) {if(!hash.count(key))return -1;Node* node = hash[key];removeNode(node);addNodeHead(node);return node -> val;}void put(int key, int value) {if(hash.count(key)){   //该键已经存在Node* node = hash[key];node -> val = value;removeNode(node);addNodeHead(node);}else{   //插入的为新键if(size >= capacity){  //已经达到最大容量Node* removed = tail -> pre;  //删除双向链表中的最后一个节点hash.erase(removed -> key);  //及时从哈希表中删除不活跃节点对应的键removeNode(removed);size--;}Node *node = new Node(key, value);addNodeHead(node);hash[key] = node;size++;}}//自定义删除节点函数void removeNode(Node *node){node -> pre -> next = node -> next;node -> next -> pre = node -> pre;}//自定义添加节点函数void addNodeHead(Node *node){node -> pre = head;node -> next = head -> next;head -> next -> pre = node;head -> next = node;}};/*** 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.xdnf.cn/news/320365.html

相关文章:

  • 信息论12:从信息增益到信息增益比——决策树中的惩罚机制与应用
  • 三角网格减面算法及其代表的算法库都有哪些?
  • “430”“531”光伏政策变革下,安科瑞如何 “保驾护航”?
  • Oracle OCP认证考试考点详解083系列11
  • windows10系统:如何使用电脑控制手机上多个应用程序(app)?
  • Oracle Goldengate并行复制
  • JS进阶DAY2 构造函数数据常用函数
  • 基于深度学习的交通标志识别系统
  • 如何根据HardFault中断抛出的寄存器值排查数组越界
  • 【EasyPan】loadDataList方法及checkRootFilePid方法解析
  • 阿里云服务器-宝塔面板安装【保姆级教程】
  • 如何将B站(哔哩哔哩)的视频下载到电脑
  • 二叉查找树,平衡二叉树(AVL),b树,b+树,红黑树
  • 实验一:Linux静态路由
  • 如何利用 Elastic Load Balancing 提升应用性能与可用性?
  • VScode一直处于循环“正在重新激活终端“问题的解决方法
  • 软件设计师2025
  • 隐私计算技术及其在数据安全中的应用:守护数据隐私的新范式
  • Word如何制作三线表格
  • ABB机器人基础课件及培训视频教程
  • RabbitMQ中Exchange交换器的类型
  • 国产Word处理控件Spire.Doc教程:在Java中为Word文本和段落设置边框
  • 【Pandas】pandas DataFrame rolling
  • ✨WordToCard使用分享✨
  • 2-C#控件
  • [数据库之九] 数据库索引之顺序索引
  • Cloudera CDP 7.1.3 主机异常关机导致元数据丢失,node不能与CM通信
  • 007 Linux 开发工具(上)—— vim、解放sudo、gc+
  • Java学习手册:ORM 框架性能优化
  • 嵌入式软件学习指南:从入门到进阶