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 小时前
std::function 详解:用法、原理与现代 C++ 最佳实践
c++
樱木Plus2 天前
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)
c++
blasit4 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
肆忆_5 天前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星5 天前
虚函数表:C++ 多态背后的那个男人
c++
端平入洛7 天前
delete又未完全delete
c++
端平入洛8 天前
auto有时不auto
c++
哇哈哈20219 天前
信号量和信号
linux·c++
多恩Stone9 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
蜡笔小马9 天前
21.Boost.Geometry disjoint、distance、envelope、equals、expand和for_each算法接口详解
c++·算法·boost