class LRUCache { public: list<pair<int,int>> q; unordered_map<int,list<pair<int,int>>::iterator> m; int cap; LRUCache(int capacity) { cap = capacity; } int get(int key) { if (!m.count(key)) return -1; auto it = m[key]; int val = it->second; q.erase(it); q.push_front({key,val}); m[key] = q.begin(); return val; } void put(int key, int value) { if (m.count(key)) { auto it = m[key]; q.erase(it); q.push_front({key,value}); m[key] = q.begin(); return; } if (m.size() == cap) { auto it = q.rbegin(); int delete_key = it->first; q.pop_back(); m.erase(delete_key); } q.push_front({key,value}); m[key] = q.begin(); } }; /** * 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); */