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

函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

思路总结:DlinkNode结构体创建双链表,双链表有key和val;

pre和next指针,并且进行初始化。

哈希表cache存着key和双链表节点

初始化head和tail(head和tail并不存储实际数据)

在LRUCache函数中 要clear哈希表,并且把tail加进双链表

在addNode中 如果有 可以直接返回 如果没有就需要弄个cur

把cur放到head的后面最佳

在deltNode中 如果没有 可以直接返回 如果有就erase他

删除的操作就是把他的前后找到 然后前后接上 把他悬挂

在get操作中,如果没有这个 返回-1;

如果有 就要先给他deletNode 再给他addNode

在put操作中,如果有,就先deletNode 再addNode

如果没有,就看看现在的哈希表是不是等于容量

如果等于容量:那就把tail前一个给他deleNode了

如果不等于容量:简单直接addNode。

cpp 复制代码
struct DlinkNode{
    int key;
    int val;
    DlinkNode*pre;
    DlinkNode*next;
    DlinkNode():key(-1),val(-1),next(nullptr),pre(nullptr){}
    DlinkNode(int _key,int _val):key(_key),val(_val),next(nullptr),pre(nullptr){}
};
class LRUCache {
private:
unordered_map<int,DlinkNode*>cache;
    DlinkNode*head;
    DlinkNode*tail;
    int limit;
public:
    LRUCache(int capacity) {
        limit=capacity;
        cache.clear();
        head=new DlinkNode();
        tail=new DlinkNode();
        head->next=tail;
        tail->pre=head;
    }
    
    int get(int key) {
        if(!cache.count(key)){
            return -1;
        }
        int val=cache[key]->val;
        deltNode(key);
        addNode(key,val);
        return val;
    }
    
    void put(int key, int value) {
        if(cache.count(key)){
            deltNode(key);
            addNode(key,value);
        }else{
            if(cache.size()==limit){
                deltNode(tail->pre->key);
                addNode(key,value);
            }else{
                addNode(key,value);
            }
        }
    }
    void addNode(int key,int val){//添加
        //在头部添加
        if(cache.count(key)){
            return;
        }
        DlinkNode*cur=new DlinkNode(key,val);
        cur->next=head->next;
        head->next->pre=cur;
        cur->pre=head;
        head->next=cur;
        cache[key]=cur;
    }
    void deltNode(int key){//删除
        if(!cache.count(key)){
            return;
        }
        DlinkNode*cur=cache[key];
        cache.erase(key);
        DlinkNode*front=cur->pre;
        DlinkNode*back=cur->next;
        front->next=back;
        back->pre=front;
        cur->pre=nullptr;
        cur->next=nullptr;
    }
};
相关推荐
君顾14 分钟前
智慧场馆解决方案小程序系统开发实战指南
java·开发语言·智慧场馆
学习星球7 分钟前
【LeetCode算法题精讲】二分查找精讲
java·数据结构·算法·leetcode·职场和发展·图搜索
Escalating_xu13 分钟前
【Linux线程同步】从数据竞争到 mutex、条件变量与生产者消费者(上篇)
android·java·linux
承渊政道23 分钟前
10:30提交预约会不会撞上10:00的会议?我用飞算JavaAI3.9.1和3.9.9跑了四个时间段
java·springboot·ai编程·飞算javaai·java代码生成
SL_staff25 分钟前
风控规则如何从硬编码解耦?我们在 JVS-Rules 中的实践与思考
java·spring boot·设计模式
_Narcissus_27 分钟前
B+树的概念和操作笔记(含完整代码实现)
c语言·数据结构·数据库·c++·笔记·b树·算法
aichitang202429 分钟前
快乐泛函每一天!内积空间
c++·python·数学·算法·机器学习·ai·泛函分析
Ravikov32 分钟前
工具开发-ESP32程序管理系统 | 具体实现(一)
c++
数据库技术讲堂36 分钟前
从 GitOps 到数据库变更:NineData 如何打通 CI/CD 的数据库治理链路
java·数据库·ci/cd
深海呐1 小时前
Java 位运算符的实际应用:不止面试刷题,业务同样能用
java·位运算符·java 位运算·java 开发技巧·状态位设计·java 高阶用法·位运算符实战