Problem
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and put.
get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
put(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
The cache is initialized with a positive capacity.
Follow up:
Could you do both operations in O(1) time complexity?
Example
LRUCache cache = new LRUCache( 2 /* capacity */ );
cache.put(1, 1);
cache.put(2, 2);
cache.get(1); // returns 1
cache.put(3, 3); // evicts key 2
cache.get(2); // returns -1 (not found)
cache.put(4, 4); // evicts key 1
cache.get(1); // returns -1 (not found)
cache.get(3); // returns 3
cache.get(4); // returns 4
Solution

注意get时,也要更新哈希表和链表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | class LRUCache { public: LRUCache(int capacity) { cap = capacity; } int get(int key) { auto it= hash_table.find(key); if(it == hash_table.end()) //key not in cache return -1; pair<int,int> kv = *(it->second); int ret = kv.second; //Move current kv to cache head cache.erase(it->second); cache.push_front(kv); //update hash_table hash_table[key] = cache.begin(); return ret; } void put(int key, int value) { auto it= hash_table.find(key); if(it != hash_table.end()) //key in cache { cache.erase(it->second); } else { if(cache.size() == cap)//cache is full,remove the least recent used { pair<int,int> kv = cache.back(); cache.pop_back(); hash_table.erase(kv.first); } } cache.push_front(pair<int,int>(key,value)); hash_table[key] = cache.begin(); } private: int cap; list<pair<int,int>> cache; unordered_map<int,list<pair<int,int>>::iterator> hash_table; }; /** * 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); */ |