When I got this problem, I used one Deque and one map to solve it, the solution is as following, the time complexity of get() and put() is O(n), n is the capacity.
This solution will TLE under big data situation.
class LRUCache { private Map<Integer, Integer> map = new HashMap<>(); private Deque<Integer> queue = new LinkedList<>(); private int max; public LRUCache(int capacity) { max = capacity; } public int get(int key) { if(map.containsKey(key)){ for(int i: queue){ if(i==key){ queue.remove(i); break; } } queue.push(key); return map.get(key); } else return -1; } public void put(int key, int value) { if(map.containsKey(key)){ for(int i: queue){ if(i==key){ queue.remove(i); break; } } } else if(map.size()==max){ int i =queue.getLast(); queue.remove(i); map.remove(i); } queue.push(key); map.put(key, value); } }
Actually, there is a "LinkedHashMap" in Java, we can use this "LinkedHashMap" to combine the function of Deque and HashMap, and make the time complexity of get() and put() to O(1).
class LRUCache { private LinkedHashMap<Integer, Integer> map = new LinkedHashMap<>(); private int max; public LRUCache(int capacity) { max = capacity; } public int get(int key) { if(map.containsKey(key)){ int value = map.get(key); map.remove(key); map.put(key, value); return value; }else return -1; } public void put(int key, int value) { if(!map.containsKey(key)){ if(map.size() == max){ for(int i:map.keySet()){ map.remove(i); break; } } }else map.remove(key); map.put(key, value); } }