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);
 */
相关推荐
星火开发设计10 分钟前
C++ queue 全面解析与实战指南
java·开发语言·数据结构·c++·学习·知识·队列
橘颂TA16 分钟前
【剑斩OFFER】算法的暴力美学——力扣 394 题:字符串解码
数据结构·c++·结构与算法
txinyu的博客1 小时前
结合游戏场景理解,互斥锁,读写锁,自旋锁,CAS / 原子变量,分段锁
开发语言·c++·游戏
hugerat1 小时前
在AI的帮助下,用C++构造微型http server
linux·c++·人工智能·http·嵌入式·嵌入式linux
-森屿安年-1 小时前
unordered_map 和 unordered_set 的实现
数据结构·c++·散列表
九久。2 小时前
手动实现std:iterator/std:string/std::vector/std::list/std::map/std:set
c++·stl
小羊羊Python2 小时前
Sound Maze - 基于 SFML+C++14 的音效迷宫开源游戏 | MIT 协议
c++·游戏·开源
txinyu的博客2 小时前
HTTP服务实现用户级窗口限流
开发语言·c++·分布式·网络协议·http
代码村新手2 小时前
C++-类和对象(上)
开发语言·c++
txinyu的博客2 小时前
map和unordered_map的性能对比
开发语言·数据结构·c++·算法·哈希算法·散列表