Analysis: multimap should be the best data structure to use.
class LFUCache{ unordered_map<int, multimap<int, pair<int,int>>::iterator> mMap; multimap<int, pair<int,int>> mList; int mCap; public: LFUCache(int capacity) { mCap = capacity; } void moveToHead(int key) { multimap<int, pair<int,int>>::iterator it = mMap[key]; pair<int, pair<int,int>> n(it->first+1, pair<int,int>(it->second.first, it->second.second)); mList.erase(it); mMap[key] = mList.insert(n); } int get(int key) { if(!mMap.count(key)) return -1; moveToHead(key); return mMap[key]->second.second; } void set(int key, int value) { if(mMap.count(key)) { mMap[key]->second.second = value; moveToHead(key); return; } if(mList.size() == mCap) { auto it = mList.begin(); mMap.erase(it->second.first); mList.erase(it); } pair<int,pair<int,int>> n(1, pair<int,int>(key, value)); mMap[key] = mList.insert(n); } };