当前位置: 首页 > article >正文

Leetocde146. LRU 缓存

【LeetCode 146. LRU 缓存【高频面试题】】 https://www.bilibili.com/video/BV1UL411c7qA/?share_source=copy_web&vd_source=afbacdc02063c57e7a2ef256a4db9d2a

class LRUCache {
public:
    struct Node{
        int k,v;
        Node* prev,*next;
        Node(int key,int val):k(key),v(val) , prev(nullptr) , next(nullptr)  {}
    }*h,*t;
    typedef Node* PNode;
    unordered_map<int,PNode> cache;
    int n , sz;//n是最大容量,sz是当前数量
    LRUCache(int capacity) {
        n = capacity;
        sz = 0;
        h = new Node(0,0) , t = new Node(0,0); 
        h->next = t;
        t->prev = h;
    }
    int get(int key) {
        if(!cache.count(key))
            return -1;
        PNode p = cache[key];
        moveToHead(p);
        return p->v;
    }
    void put(int key, int value) {
        if(!cache.count(key)){
            PNode p = new Node(key,value);
            cache[key] = p;
            add(p);
            ++sz;
            if(sz > n){//oversize
                PNode p = removeTail();//删除尾节点
                cache.erase(p->k);
                delete p;
                --sz;
            }
        }
        else{
            PNode p = cache[key];
            p->v = value;
            moveToHead(p);
        }
    }
    void add(PNode p){//
        p->prev = h;
        p->next = h->next;
        h->next->prev = p;
        h->next = p;
    }
    void remove(PNode p){
        p->prev->next = p->next;
        p->next->prev = p->prev;
    }
    void moveToHead(PNode p){
        remove(p);
        add(p);
    }
    PNode removeTail(){
        PNode p = t->prev;//方法体不能写成remove(pt->prev); return t->prev;
        remove(p);
        return p;
    }
};

http://www.kler.cn/news/311864.html

相关文章:

  • 梧桐数据库(WuTongDB):postgresql 12的CBO(Cost-Based Optimizer)优化器
  • 浅谈人工智能之基于HTTP方式调用本地QWen OPenAI接口(Java版)
  • 股指期权交易详细基础介绍
  • 图像亮度均衡算法
  • QFramework v1.0 使用指南 更新篇:20240918. 新增 BindableList
  • 利用反射实现动态代理
  • qiankun沙箱实现原理
  • linux之网络命令
  • 移动开发(三):使用.NET MAUI打包第一个安卓APK完整过程
  • .NET内网实战:通过命令行解密Web.config
  • 一文了解高速工业相机
  • ant vue3 datePicker默认显示英文
  • Spring Boot中配置图片资源通常涉及到静态资源的管理
  • 基于单片机的智能家居控制系统设计
  • python 爬虫 selenium 笔记
  • HarmonyOS开发实战(5.0)实现二楼上划进入首页效果详解
  • 典型的MVC设计模式:使用JSP和JavaBean相结合的方式来动态生成网页内容典型的MVC设计模式
  • 大数据框架常用端口号总结
  • 局域网视频
  • 【机器学习】经典数据集鸢尾花的分类识别
  • vue2.0+ts注册全局函数和几个递归查找
  • 前端vue-关于标签切换的实现
  • 【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL24
  • 基于CNN的10种物体识别项目
  • Spark-ShuffleWriter-UnsafeShuffleWriter
  • react是什么?
  • 数据结构、STL
  • 私域直播平台带源码
  • FRIDA-JSAPI:Java使用
  • leetcode:字符串中的第一个唯一字符