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(); } } };