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.
The cache is initialized with a positive capacity.
Follow up:
Could you do both operations in O(1) time complexity?
Example:
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
Solution
Solution 1 -- Java LinkedHashMap
Make use of Java library, LinkedHashMap, ordered and keep track of map size.
when insert into new (key,value) into map, check map already reach capacity or not:
if reach capacity, then remove last value from map, insert (key, value) into head of map
if not reach capacity, insert into head of map
when fetch value by key, check whether key in map or not:
if key not in map, return -1
if key in map, get value by key, remove current key from map, insert current key into head of map