力扣打卡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可以利用双端链表的特性,可以灵活的将对应结点移到队首,将队尾的删除。

我的方法:

cpp 复制代码
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]--;
            }
        }
    }
};
相关推荐
wuweijianlove10 小时前
算法性能优化中的数据流重构与依赖消解的技术6
算法
Agent手记11 小时前
智能财务对账Agent如何设计?2026金融大模型Agent架构设计与实战指引
人工智能·算法·ai·金融
计算机安禾11 小时前
【算法分析与设计】第5篇:最大子数组问题:分治与线性扫描的对比分析
算法
dinl_vin11 小时前
FastAPI 系列·(七):Redis 集成——缓存、分布式锁与 Session 管理
redis·缓存·fastapi
z2005093011 小时前
今日算法(组合问题)(回溯解法)
算法·深度优先
Shiy_11 小时前
用 TypeScript 验证三门问题:为什么换门胜率是 2/3?
算法·typescript
Yunzenn11 小时前
深度解析字节最新研究-Cola DLM 第 06 章:分块因果 DiT 先验 —— 在隐空间里做 Flow Matching
人工智能·算法·架构
HjhIron11 小时前
数组去重:从零开始,写一个靠谱的工具函数
算法·面试
阿黎梨梨11 小时前
#动态规划入门:从“爬楼梯”问题理解核心思想
算法
黎阳之光11 小时前
技术赋能智慧新能源|黎阳之光风电叶片光栅载荷+声纹AI智能监测技术落地应用
大数据·人工智能·物联网·算法·安全