leetcode 146 LRU C++ 实现

LRU :

1、整体使用哈希双向链表,

哈希用于快速找到需要处理的链表节点

链表用于表示各个节点的顺序

  LRU (最近最少使用) 缓存机制 。

 

class Node
{
public:
    int key,value;
    Node *next,*pre;
    Node(int k, int v)
    {
        key = k;
        value = v;
    }
};

struct DoubleList
{
private:
    Node *head,*tail;
    int size;
public:
    DoubleList()
    {
        head = new Node(0,0);
        tail = new Node(0,0);
        head->next = tail;
        tail->pre = head;
        size = 0;
    }
    void addLast(Node *x)
    {
        x->pre = tail->pre;
        x->next = tail;
        tail->pre->next = x;
        tail->pre = x;
        size++;
    }
    void remove(Node *x)
    {
        x->pre->next = x->next;
        x->next->pre = x->pre;
        size--;
    }
    Node *removeFrist()
    {
        if(head->next == tail)
        {
            return NULL;
        }
        Node *frist = head->next;
        remove(frist);
        return frist;
    }
    int getSize()
    {
        return size;
    }


};
class LRUCache {
private:
    unordered_map<int,Node*> map;
    DoubleList cache;
    int cap;
    void makeRecently(int key)
    {
        Node *x = map[key];
        cache.remove(x);
        cache.addLast(x);
    }
    void addRecently(int key, int val)
    {
        Node *x = new Node(key,val);
        cache.addLast(x);
        map[key] =x;
    }
    void deleteKey(int key)
    {
        Node *x = map[key];
        cache.remove(x);
        map.erase(key);
    }
    void removeLeastRecently()
    {
        Node  *deleteNode = cache.removeFrist();
        map.erase(deleteNode->key);
    }
public:
    LRUCache(int capacity) {
        cap = capacity;
    }
    
    int get(int key) {
        if(map.count(key) > 0)
        {
            makeRecently(key);
            return map[key]->value;
        }
        return -1;

    }
    
    void put(int key, int value) {
        if(map.count(key) > 0)
        {
            deleteKey(key);
            addRecently(key,value);
            return;
        }
        if(cap == cache.getSize())
            removeLeastRecently();
        addRecently(key,value);


    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

samoyan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值