Leetcode146. LRU 缓存(HOT100)

链接

代码:

cpp 复制代码
class LRUCache {
private:
    struct Node{
        int key,val;
        Node* left,*right;
        Node(int _key,int _val):key(_key),val(_val){}
    }*L,*R;

    unordered_map<int,Node*> hash;
    int n;

public:
    void remove(struct Node* p){
        p->left->right = p->right;
        p->right->left = p->left;
        //不要delete p;因为有可能我们只是更新一个Node,即:将它从list中remove,然后再insert进来,真正删掉一个节点是在超过capacity时
    }
    void insert(struct Node* p){
        p->right = L->right;
        p->left = L;
        L->right = p;
        p->right->left = p;
    }
    LRUCache(int capacity) {
        n = capacity;//capacity是一个形参,函数结束就销毁了,所以我们用一个n来记录
        L = new Node(-1,-1),R = new Node(-1,-1);//定义左右两个节点,用来管理双向链表。
        L->right = R,R->left = L;
    }
    
    int get(int key) {
        if(hash.count(key)==0)return -1;
        auto p = hash[key];//p是一个迭代器
        remove(p);
        insert(p);
        return p->val;
    }
    
    void put(int key, int value) {
        if(hash.count(key)){
            auto p = hash[key];
            p->val = value;
            remove(p);
            insert(p);
        }
        else{
            if(n==hash.size()){
                auto p = R->left;//p是一个Node
                remove(p);
                hash.erase(p->key);//erase需要参数key,我们通过Node找到其中的key
                delete p;
            }
            auto q = new Node(key,value);
            hash[key] = q;//not hash[key] = value;//hash的value是一个Node
            insert(q);//在双向链表中插入时,别忘了在hash中也插入
        }
    }
};

图解:

L和R是两个指向虚拟左右节点的指针,它们中间管理所有已经在hash表中的key value值以及相邻节点的地址。

相关推荐
技术小白爱FPGA1 小时前
使用verilog 实现cordic 算法 ---- 向量模式
算法·fpga开发
Ring__Rain2 小时前
c版的findcontours改写,输出为vector<vector<cPoint>>
算法
Yoyo25年秋招冲冲冲2 小时前
Day60_补20250208_图论part5_并查集理论基础|寻找存在的路径
java·开发语言·数据结构·算法·leetcode·动态规划·图论
不会敲代码的狗3 小时前
Acwing-基础算法课笔记之基础算法(差分)
笔记·算法
rain雨雨编程3 小时前
黑马Redis详细笔记(实战篇---短信登录)
java·redis·缓存·框架·短信登录
枫叶落雨2223 小时前
07苍穹外卖之redis缓存商品、购物车(redis案例缓存实现)
缓存
攻城狮7号3 小时前
【10.7】队列-解预算内的最多机器人数目
数据结构·c++·算法
Bran_Liu4 小时前
【LeetCode 刷题】动态规划(5)-子序列问题
python·算法·leetcode·动态规划
LNsupermali4 小时前
力扣1448. 统计二叉树中好节点的数目
算法·leetcode·职场和发展
硕风和炜4 小时前
【LeetCode: 8. 字符串转换整数 (atoi) + 模拟】
java·算法·leetcode·面试·模拟