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);
 */
相关推荐
唐棣棣30 分钟前
C++:单例模式
开发语言·c++·单例模式
智多星0011 小时前
c++Qt登录页面设计
开发语言·c++·qt
Tfly__1 小时前
ubuntu 18.04安装GCOPTER(最新)
linux·c++·ubuntu·github·ros·无人机·运动规划
code monkey.1 小时前
【探寻C++之旅】第一章:C++入门
开发语言·c++
程序员老冯头1 小时前
第二十三章 C++ 继承
开发语言·数据结构·c++·算法·继承
Dream it possible!2 小时前
LeetCode 热题 100_二叉树的最大深度(37_104_简单_C++)(二叉树;递归;层次遍历)
c++·算法·leetcode
yuyanjingtao2 小时前
CCF-GESP 等级考试 2023年12月认证C++二级真题解析
c++·青少年编程·gesp·csp-j/s·编程等级考试
m0_748239332 小时前
Linux下C++轻量级WebServer服务器 框架梳理
linux·服务器·c++
Michael_Good2 小时前
【C/C++】C语言编程规范
c语言·开发语言·c++
ZLRRLZ4 小时前
【C++】多态
开发语言·c++