美文网首页
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

    这道题目还挺新颖的,要求我们根据需求来设计一个数据结构,使得查找和添加元素的复杂度都是。这题我直接参考了别人的做法...

  • cache缓存

    -(NSCache *)cache { if (_cache == nil) { _cache = [[NSCac...

  • apache geode docs

    Apache Cache Docs [Apache Cache Docs](# Apache Cache Docs...

  • 清空npm 缓存

    npm cache verify npm cache clean npm cache clean --force ...

  • cache_t结构探一探

    接上文类的结构分析 一.cache_t结构 1.cache_t结构 cache是cache_t类型,那么cache...

  • Invalid response body while tryi

    该报错解决办法: npm cache verifynpm cache cleannpm cache clean -...

  • python: flask的动态cache

    cache.set()以及cache.get()的使用 flask的cache功能十分强大,所谓的动态cache,...

  • HTTP首部(二)

    Cache-Control扩展 cache-extension token Cache-Control: priv...

  • Redis-Spring Cache

    零、本文纲要 一、Spring Cache介绍 Spring Cache Spring Cache常用注解 二、 ...

  • RocksDB. LRUCache源码分析

    Block Cache RocksDB使用Block cache作为读cache。用户可以指定Block cach...

网友评论

      本文标题:Leetcode-146-LRU Cache

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