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

146. LRU Cache

题目描述

146. LRU Cache

 

哈希表+双向链表

详见代码和注释:

class LRUCache {
private:int capacity_{0};int size_{0};struct Node{int key{0};int val{0};Node* pre{nullptr};Node* next{nullptr};Node(int k,int v,Node* pr,Node* nex):key(k),val(v),pre(pr),next(nex){}};Node* head_{nullptr};Node* tail_{nullptr};//使用哈希表让查找的时间复杂度降为O(1)unordered_map<int,Node*> data_;public:LRUCache(int capacity):capacity_(capacity) {//题目保证传入大于0的capacity,非法值没考虑}int get(int key) {if(data_.contains(key)){Node* node = data_[key];setHead(node);return node->val;}return -1;}void put(int key, int value) {if(data_.contains(key)){data_[key]->val = value;setHead(data_[key]);}else{if(capacity_ > 0 && size_ == capacity_){//缓存已满Node* to_delete_LRU_node = tail_;//需要删除尾结点,tail_结点就是Least Recently Used Nodetail_ = tail_->pre;//有可能tail_和head_是同一个结点,tail_->pre是nullptrif(tail_){//to_delete_LRU_node的前面还有结点tail_->next = nullptr;}else{//to_delete_LRU_node的前面已经没有结点,to_delete_LRU_node和head_指向同一个结点//下面会通过to_delete_LRU_node销毁头结点,需要将head_设置为nullptr,不能让head_指向不存在的内存head_ = nullptr;}data_.erase(to_delete_LRU_node->key);delete to_delete_LRU_node;size_--;}Node* newnode = new Node(key,value,nullptr,head_);if(head_){head_->pre = newnode;}else{//如果头结点head_不存在,那么尾结点tail_也一定不存在tail_ = newnode;}head_ = newnode;data_[key] = newnode;size_++;}}
private://将node设置为链表的头结点,输入的node不为nullptrvoid setHead(Node* node){if(node != head_){if(node == tail_){//node是尾结点的话,node前一个结点需要作为新的尾结点tailtail_ = tail_->pre;}// if(node->pre) 判断是多余的,node不是头结点,那么node的前一个结点一定不是nullptrnode->pre->next = node->next;if(node->next){//node的下一个结点可能不存在node->next->pre = node->pre;}node->pre = nullptr;node->next = head_;//前面的条件保证了此处head_一定不为nullptrhead_->pre = node;head_ = 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);*/

几组测试用例:

["LRUCache","put","put","get","put","get","put","get","get","get"][[2],[1,1],[2,2],[1],[3,3],[2],[4,4],[1],[3],[4]]
["LRUCache","put","put","get","put","get","put","get","get","get"][[2],[1,0],[2,2],[1],[3,3],[2],[4,4],[1],[3],[4]]
["LRUCache","put","get","put","get","get"][[1],[2,1],[2],[3,2],[2],[3]]
http://www.xdnf.cn/news/8427.html

相关文章:

  • Anthropic公司近日发布了两款新一代大型语言模型Claude Opus 4与Claude Sonnet 4
  • 矩阵:线性代数在AI大模型中的核心支柱
  • 深入解析MySQL中的HAVING关键字:从入门到实战
  • Docker 与 Kubernetes 部署 RabbitMQ 集群(二)
  • C++ 忘掉std::cout吧,fmt和spdlog的结合
  • 达梦数据库-报错-01-[-3205]:全文索引词库加载出错
  • paddle 打包代码 ocr
  • 国产高云FPGA实现MIPI视频解码+图像缩放,基于OV5647摄像头,提供Gowin工程源码和技术支持
  • 04-jenkins学习之旅-java后端项目部署实践
  • 攻略生成模块
  • python邮件地址检验 2024年信息素养大赛复赛/决赛真题 小学组/初中组 python编程挑战赛 真题详细解析
  • C++---vector模拟实现
  • 黑马点评-实现安全秒杀优惠券(使并发一人一单,防止并发超卖)
  • Java桌面应用开发详解:自制截图工具从设计到打包的全流程【附源码与演示】
  • LVS + Keepalived + Nginx 高可用负载均衡系统实验
  • 详解Mysql的 Binlog、UndoLog 和 RedoLog
  • 「金融证券行业」 如何搭建自己的研发智能管理体系?
  • Linux 操作文本文件列数据的常用命令
  • @Column 注解属性详解
  • 【Nature子刊聚焦:超构表面多维调控与AI驱动的设计革命 ——2024-2025年超构表面领域突破性进展速览 】
  • 职坐标解析物联网协议与传感器技术实战应用
  • MuJoCo安装记录
  • 一个基于 ESP-IDF 的 RPC over UDP 示例
  • 2025 最新 Redis 面试题大全
  • 探索服务网格(Service Mesh):云原生时代的网络新范式
  • DDR DFI 5.2 协议接口学习梳理笔记01
  • 工业软件国产化:构建自主创新生态,赋能制造强国建设
  • NIST提出新型安全指标:识别潜在被利用漏洞
  • 港口危货储存单位主要安全管理人员考试题
  • java使用aspose合并exl单元格