leetcode 146 LRU缓存机制

题目描述:

 

 

 题解:首先需要一个数据结构记录哪些key存在cache里面,而且这个数据结构要能够在get,put操作的时候在常数的时间复杂度内改变cache里数据位置。

我们用双链表模拟cache,可以直接使用stl库里面的list,list末尾的元素为最近最少使用的元素。为了在常数时间内将cache_list中某个key对应的元素提到

cache_list begin(),我们用一个map将key映射为list的某一个节点。(具体看代码就好了)

 

AC代码:

class LRUCache {
private:
    int cap;
    //存储键值对的双向链表
    list<pair<int,int>> kv;
    //key值与其在链表中位置的一一映射
    unordered_map<int,list<pair<int,int>>::iterator> m;
public:
    LRUCache(int capacity):cap(capacity){}
    int get(int key) {
        //如果没找到
        if(m.find(key)==m.end()) return -1;
        //获取键值对
        auto tmp = *m[key];
        //将这个键值对放置在链表开头
        kv.erase(m[key]);
        kv.push_front(tmp);
        //更新元素位置
        m[key] = kv.begin();
        return tmp.second;
    }
    void put(int key, int value) {
        //如果缓存中没有
        if(m.find(key)==m.end()){
            //如果缓存满,删除链表最后一个元素
            if(kv.size()==cap){
                m.erase(kv.back().first);
                kv.pop_back();
            }
            //插入新元素
            kv.push_front(make_pair(key,value));
            m[key] = kv.begin();
        }
        //如果缓存中有,更新value并将其提前至链表开头
        else{
            kv.erase(m[key]);
            kv.push_front(make_pair(key,value));
            m[key] = kv.begin();
        }
    }

};

 

posted @ 2020-03-10 10:29  猪突猛进!!!  阅读(190)  评论(0编辑  收藏  举报