146. LRU 缓存

146. LRU 缓存


题目链接:146. LRU 缓存

代码如下:

cpp 复制代码
//哈希表+双链表
//参考leetcode官方题解
//LRU:最近最少使用算法,将新插入的或刚修改或使用的放到表头,表尾即为最不常使用的
class DLinkedLNode//双链表的定义
{
public:
    int m_key,m_val;
    DLinkedLNode *pre,*next;

    DLinkedLNode():m_key(0),m_val(0),pre(nullptr),next(nullptr){}
    DLinkedLNode(int key,int value):m_key(key),m_val(value),pre(nullptr),next(nullptr){}
};

class LRUCache {
public:

    LRUCache(int capacity) {
        m_capacity=capacity;
        size=0;

        //建立头结点+尾节点
        head=new DLinkedLNode();
        tail=new DLinkedLNode();

        //首尾相连
        head->next=tail;
        tail->pre=head;
    }
    
    int get(int key) {
        if(cache.find(key)==cache.end())
            return -1;

        DLinkedLNode *node=cache[key];
        moveToHead(node);
        return node->m_val;
    }
    
    void put(int key, int value) {
        //不存在就创建
        if(cache.find(key)==cache.end())
        {
            DLinkedLNode *node=new DLinkedLNode(key,value);
            addToHead(node);
            cache[key]=node;
            size++;

            if(size>m_capacity)
            {
                cache.erase(removeTail());
                size--;
            }
        }
        else//存在就修改
        {
            DLinkedLNode* node=cache[key];
            node->m_val=value;
            moveToHead(node);
        }
    }
public:
    unordered_map<int,DLinkedLNode*> cache;
    int size;
    int m_capacity;

    DLinkedLNode *head;
    DLinkedLNode *tail;

    //把节点插入到链表头部
    void addToHead(DLinkedLNode* node)
    {
        node->pre=head;
        node->next=head->next;
        head->next->pre=node;
        head->next=node;
    }

    //把这个节点移出链表
    void removeNode(DLinkedLNode* node)
    {
        node->pre->next=node->next;
        node->next->pre=node->pre;
    }

    void moveToHead(DLinkedLNode* node)
    {
        removeNode(node);
        addToHead(node);
    }

    //返回值为key,便于查找和删除cache中保存的键值对
    int removeTail()
    {
        DLinkedLNode* node=tail->pre;
        removeNode(node);
        int key=node->m_key;
        delete node;
        return key;
    }
};

/**
 * 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);
 */
相关推荐
金博客6 分钟前
Qt 模型视图(二):模型类QAbstractItemModel
c++·qt6.7.2
五味香25 分钟前
C++学习,动态内存
java·c语言·开发语言·jvm·c++·学习·算法
无名之逆25 分钟前
计算机专业的就业方向
java·开发语言·c++·人工智能·git·考研·面试
Beauty.56830 分钟前
P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
数据结构·c++·算法
jimmy.hua1 小时前
C++刷怪笼(5)内存管理
开发语言·数据结构·c++
xiaobai12 31 小时前
二叉树的遍历【C++】
开发语言·c++·算法
DieSnowK1 小时前
[项目][WebServer][Makefile & Shell]详细讲解
开发语言·c++·http·makefile·shell·项目·webserver
dc爱傲雪和技术2 小时前
在 VS Code 中调试 C++ 项目
开发语言·c++
如意.7592 小时前
【C++】——多态详解
开发语言·c++
我爱吃福鼎肉片2 小时前
【C++】——list
c++·vector·list