题解 | #设计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);
 */

全部评论

相关推荐

05-01 22:41
中南大学 Java
点赞 评论 收藏
分享
Rena1ssance_:对的,要是面评没太烂,勤更新简历等捞就行了,腾讯可以无限复活
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务