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.
Follow up:
Could you do both operations in O(1) time complexity?
Example:
1 2 3 4 5 6 7 8 9 10 11 |
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 |
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 |
// Author: Huahua class LRUCache { public: LRUCache(int capacity) { capacity_ = capacity; } int get(int key) { const auto it = m_.find(key); // If key does not exist if (it == m_.cend()) return -1; // Move this key to the front of the cache cache_.splice(cache_.begin(), cache_, it->second); return it->second->second; } void put(int key, int value) { const auto it = m_.find(key); // Key already exists if (it != m_.cend()) { // Update the value it->second->second = value; // Move this entry to the front of the cache cache_.splice(cache_.begin(), cache_, it->second); return; } // Reached the capacity, remove the oldest entry if (cache_.size() == capacity_) { const auto& node = cache_.back(); m_.erase(node.first); cache_.pop_back(); } // Insert the entry to the front of the cache and update mapping. cache_.emplace_front(key, value); m_[key] = cache_.begin(); } private: int capacity_; list<pair<int,int>> cache_; unordered_map<int, list<pair<int,int>>::iterator> m_; }; /** * 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); */ |