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

力扣打卡5:LRU缓存

链接:146. LRU 缓存 - 力扣(LeetCode)

        这道题我解法的put函数严格意义上讲不是O(1),不如力扣官方的题解。

        我使用了哈希表存储值,这样每次get就可以O(1)了。但是put不太好优化成O(1),我使用了一个队列和一个哈希表来实现它。通过记录一个数据的使用次数存在哈希表,数据存储顺序放在queue,来实现这个put。但是如果capacity满了,每次put会弹出不定数的数据。虽然每次的次数基本会很少.但是在极端情况下会是O(n-capacity)。

        我很喜欢官方题解的方式,他使用了一个哈希表和一个双向链表,并将它们组合成一个新的数据结构,哈希表key为数据的索引,value是链表结点的指针,链表中存放数据。通过指针,将两个容器连接起来。get可以利用哈希表的性质实现快速查询,put可以利用双端链表的特性,可以灵活的将对应结点移到队首,将队尾的删除。

我的方法:

class LRUCache {
public:

    unordered_map<int,int> cache;
    unordered_map<int,int> update;
    queue<int> q;
    int cap=0;
    int n=0;
    
    LRUCache(int capacity) {
        cap=capacity;
    }
    
    int get(int key) {
        if(cache.find(key)!=cache.end())
        {
            if(update.find(key)!=cache.end()) update[key]++;
            else update[key]=1;
            q.push(key);
            return cache[key];
        }
        return -1;
    }
    
    void put(int key, int value) {
        if(cache.find(key)!=cache.end())
        {
            cache[key]=value;
            if(update.find(key)!=cache.end()) update[key]++;
            else update[key]=1;
            q.push(key);
        }
        else if(++n<=cap)
        {
            cache[key]=value;
            if(update.find(key)!=cache.end()) update[key]++;
            else update[key]=1;
            q.push(key);
        }
        else
        {
            n--;
            cache[key]=value;
            if(update.find(key)!=cache.end()) update[key]++;
            else update[key]=1;
            q.push(key);
            while(1)
            {
                int t=q.front();
                q.pop();
                if(update[t]<=1)
                {
                    update[t]--;
                    cache.erase(t);
                    return;
                }
                update[t]--;
            }
        }
    }
};


http://www.kler.cn/a/428785.html

相关文章:

  • 云原生周刊:K8s 生产环境架构设计及成本分析
  • mysql之基本常用的语法
  • 机器人“大脑+小脑”范式:算力魔方赋能智能自主导航
  • 大数据学习(36)- Hive和YARN
  • 5、docker-compose和docker-harbor
  • TTL 在 Redis 缓存中的作用
  • Qt 面试题学习14_2024-12-6
  • Docker单机网络:解锁本地开发环境的无限潜能
  • Android 15 平台签名的共享 UID 许可名单
  • SQL面试题——京东SQL面试题 合并数据
  • 【Canvas与图标】乡土风金属铝边立方红黄底黑字图像处理图标
  • C#生成CSR(CertificateSigningRequest)和密钥
  • SQL高级应用——存储过程与触发器
  • 报错:Invalid HTTP method: PATCH executing PATCH http://XXX.XXX
  • [C++]C风格数组之指针数组、数组指针、指向数组的指针、指向数组第一个元素的地址的指针的异同和联系
  • 选择 ASP.NET Core Web UI
  • MicroBlaze软核开发(一):Hello World
  • World Labs发布最新3D世界生成模型 | 李飞飞引领AI创新
  • Spring事务的一道面试题
  • React - useContext和深层传递参数
  • AndroidStudio 自定义 lint
  • Redis中pipeline(管道)详解
  • 经验帖 | Matlab安装成功后打不开的解决方法
  • MSSQL靶场(手工注入)通关攻略 第一关
  • 《Java 中 JDBC 连接 MySQL 实现增删改查全攻略》
  • jeccg-boot修改密码