https://leetcode.com/problems/lru-cache/description/
class LRUCache {
public:
LRUCache(int capacity):cap(capacity) {
}
int get(int key) {
auto it = mem.find( key );
if (it == mem.end()) {
return -1;
}
nums.splice( nums.begin(), nums, it->second);
return it->second->second;
}
void put(int key, int value) {
if (mem.find(key) != mem.end()) {
nums.erase( mem[key] );
// mem.erase( key );
}
nums.push_front( make_pair(key, value) );
mem[key] = nums.begin();
if (mem.size() > cap) {
auto v = nums.back();
mem.erase( v.first );
nums.pop_back();
}
}
int cap;
list< pair<int, int> > nums;
unordered_map< int, list< pair<int, int> >::iterator > mem;
};
/**
* 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);
*/