Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get
and set
.
get(key)
- Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.set(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.
Solution:
1 class LRUCache{ 2 public: 3 vector<int> keys; 4 unordered_map<int, int> map; 5 int size = 0; 6 LRUCache(int capacity) { 7 size = capacity; 8 } 9 10 void adjust(int key){ 11 int idx = -1; 12 for(int i = keys.size() - 1; i >= 0 ; i --) 13 if(keys[i] == key){ 14 idx = i; 15 break; 16 } 17 18 if(idx == -1) 19 return; 20 21 keys.erase(keys.begin() + idx); 22 keys.push_back(key); 23 } 24 25 int get(int key) { 26 if(map.find(key) == map.end()){ 27 return -1; 28 }else{ 29 adjust(key); 30 return map[key]; 31 } 32 } 33 34 void set(int key, int value) { 35 if(map.find(key) != map.end()){ 36 map[key] = value; 37 adjust(key); 38 return; 39 } 40 41 if(keys.size() >= size ){ 42 int key_to_erase = keys[0]; 43 keys.erase(keys.begin()); 44 map.erase(key_to_erase); 45 } 46 47 keys.push_back(key); 48 map[key] = value; 49 } 50 };