当前位置: 首页 > 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);*/

相关文章:

  • Inference-Time Scaling for Generalist Reward Modeling
  • (四)Java逻辑运算符和位运算符全面解析
  • 通配符 DNS 记录:应用场景与相关风险
  • SEO关键词与长尾词精准布局策略
  • 【Bootstrap V4系列】学习入门教程之 组件-折叠(Collapse)
  • mysql修改root密码
  • C++20新特新——02特性的补充
  • 性能比拼: Redis Streams vs Pub/Sub
  • 解决使用lettuce连接Redis超时的问题(tcpUserTimeout 参数失效问题)
  • YOLOv1:开创实时目标检测新纪元
  • Wireshark抓账号密码
  • 普通笔记本与军用加固笔记本电脑的区别,探索防水、防爆、防摔的真·移动工作站!
  • 在线PDF阅读方案:jQuery + PDF.js
  • 内网和外网怎么互通?外网访问内网的几种简单方式
  • 解决HomeAssistant 无法安装 samba share问题
  • 【数据库原理及安全实验】实验六 角色访问控制
  • 《C++ Templates》:有关const、引用、指针的一些函数模板实参推导的例子
  • C#——NET Core 中实现汉字转拼音
  • Redis 8.0 正式版发布,新特性很强!
  • 品质领航家装时代,亚新丽以匠心雕琢每一寸美好
  • 上海“量子城市”先导应用场景落地曹杨社区,提供哪些服务?
  • “80后”赵亮出任上海普陀区委副书记
  • 复旦大学文科杰出教授裘锡圭逝世,享年90岁
  • 追光|铁皮房、土操场,这有一座“筑梦”摔跤馆
  • 国家主席习近平同普京总统共见记者
  • 复旦设立新文科发展基金,校友曹国伟、王长田联合捐赠1亿元