美文网首页
Leetcode-146-LRU Cache

Leetcode-146-LRU Cache

作者: 单调不减 | 来源:发表于2019-05-20 10:48 被阅读0次

    这道题目还挺新颖的,要求我们根据需求来设计一个数据结构,使得查找和添加元素的复杂度都是O(1)。这题我直接参考了别人的做法(因为确实没什么思路),就当学习了。

    代码摘自linz36的回答。

    可以看到,这种解法把unordered_map和list结合起来了。我们首先熟悉一下这两种数据结构。unordered_map是关联容器,它存储由键值和映射值组合而成的元素,并允许基于键快速检索单个元素。无序映射实现了直接访问操作符(operator[]),该操作符允许使用键值作为参数直接访问映射值。list是一个线性双向链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。由于其结构的原因,它可以迅速地在任何节点进行插入和删除操作。

    class LRUCache {
    public:
        int size;
        list<int> lru;                              // MRU ... LRU
        unordered_map<int, list<int>::iterator> mp; // key -> iterator
        unordered_map<int, int> kv;                 // key -> value
    
        LRUCache(int capacity) : size(capacity) {}
        int get(int key) {
            if (kv.count(key) == 0) return -1;
            updateLRU(key);
            return kv[key];
        }
        void put(int key, int value) {
            if (kv.size() == size && kv.count(key) == 0)
                evict();
            updateLRU(key);
            kv[key] = value;
        }
        void updateLRU(int key) {
            if (kv.count(key)) 
                lru.erase(mp[key]);
            lru.push_front(key);
            mp[key] = lru.begin();
        }
        void evict() {
            mp.erase(lru.back());
            kv.erase(lru.back());
            lru.pop_back();
        }
    };
    
    /**
     * Your LRUCache object will be instantiated and called as such:
     * LRUCache* obj = new LRUCache(capacity);
     * int param_1 = obj->get(key);
     * obj->put(key,value);
     */
    

    相关文章

      网友评论

          本文标题:Leetcode-146-LRU Cache

          本文链接:https://www.haomeiwen.com/subject/jgphzqtx.html