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

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]]

相关文章:

  • 多元回归的置信区间
  • JavaScript运算符全解析:从基础到进阶实战指南
  • 算法修仙传 第二章 坊市奇遇:链表操作入门
  • 003-类和对象(二)
  • MySQL 8.0 OCP 1Z0-908 题目解析(12)
  • 【动态规划】5 从一次函数出发推导斜率优化dp
  • 零件剖切配置教学 | 玩转EasyTwin 工业产线第三期(上)课程回顾
  • 论文解读: 2023-Lost in the Middle: How Language Models Use Long Contexts
  • javaEE课程项目-壁纸管理系统
  • ollama 部署模型休眠、释放问题
  • 从零入门:Google Cloud Platform (GCP) 基础架构与核心服务全解析
  • 【Go-4】函数
  • 基于BERT预训练模型(bert_base_chinese)训练中文文本分类任务(AI老师协助编程)
  • 基于DPABI提取nii文件模板的中心点坐标
  • 如何使用 WebStorm 编写第一个 Node.js 项目
  • C++滑动门问题(附两种方法)
  • Three.js与Babylon.js对比
  • Java—— 网络爬虫
  • 设计模式——简单工厂模式
  • CST软件基础六:视图
  • seo上排名/百度词条优化
  • 网页构建器/长沙seo结算
  • 深圳响应样式网站建设费用/获客渠道找精准客户
  • 网站开发怎样/seo排名快速优化
  • 巨量广告投放平台/奉化网站关键词优化费用
  • 中国十大电商公司/怎么关闭seo综合查询