zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    
    };
  • 相关阅读:
    排序算法之--堆排序
    排序算法之--插入排序
    排序算法之--直接选择排序
    排序算法之--快速排序(及优化测试亿级100_000_000用时)
    分布式计算--(分布式+多进程+多线程+多协程)
    HDU
    2019牛客多校第四场D-triples I 贪心
    Interview_C++_day8
    Interview_C++_day7
    Interview_C++_day6
  • 原文地址:https://www.cnblogs.com/z1141000271/p/12454138.html
Copyright © 2011-2022 走看看