题解 | #设计LRU缓存结构#

设计LRU缓存结构

https://www.nowcoder.com/practice/5dfded165916435d9defb053c63f1e84

class Solution {
private:
    int capacity;
    // 双向链表存储键值对,保持访问顺序,O(1) 时间插入删除
    // int key, int value
    list<pair<int, int>> items;
    // 哈希表 O(1) 时间快速访问
    // int key, iterator value
    unordered_map<int, list<pair<int, int>>::iterator> cache;

public:
    Solution(int capacity) : capacity(capacity) {
        // write code here
    }
 
    int get(int key) {
        // write code here
        auto it = cache.find(key);
        if (it == cache.end()) {
            return -1; // 缓存里没找到
        }
        // 移动到链表头部
        items.splice(items.begin(), items, it->second);
        return it->second->second;
    }
 
    void set(int key, int value){
        // write code here
        auto it = cache.find(key);
        if (it != cache.end()) {
            // 更新值且移动到链表头部
            it->second->second = value;
            items.splice(items.begin(), items, it->second);
            return;
        }

        if (items.size() == capacity) {
            // 达到容量上限了
            auto last = items.back();
            cache.erase(last.first);
            items.pop_back();
        }

        // 在链表头部插入新元素,并在哈希表中存储对应迭代器
        items.emplace_front(key, value);
        cache[key] = items.begin();
    }
};

/**
 * Your Solution object will be instantiated and called as such:
 * Solution* solution = new Solution(capacity);
 * int output = solution->get(key);
 * solution->set(key,value);
 */

全部评论

相关推荐

2025-12-28 16:32
重庆邮电大学 Java
程序员花海:1.技能放最后,来面试默认你都会,技能没啥用 2.实习写的看起来没啥含金量,多读读部门文档,包装下 接LLM这个没含金量 也不要用重构这种 不会给实习生做的 3.抽奖这个还是Demo项目,实际在公司里面要考虑策略,满减,触发点,触发规则 库存 之类的,不是这个项目这么简单 4.教育背景提前,格式为 教育背景 实习 项目 技能 自我评价
简历被挂麻了,求建议
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务