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 ('ll 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 is reached its capacity, it should invalidate the least recently used item before inserting a new item.
A difficult design problem is generally double list + Hashmap<key, NODE>[LRU, mid stack] or tree + hashmap <key, node> [Relation tree or Tire
//new node in the tail, old node in the head;classdoublelist{intkey; intVal; Doublelist prev; Doublelist Next; PublicDoublelist (intKeyintval) { This. Key =key; This. val =Val; }} Public classLRUCache {intindex = 0; intcapacity; Doublelist tail; Doublelist Head; HashMap<integer, doublelist>map; PublicLRUCache (intcapacity) { This. Capacity =capacity; This. Map =NewHashmap<integer, doublelist>(); This. Head =NewDoublelist (0,0); This. Tail =NewDoublelist (0,0); Head.next=tail; Tail.prev=Head; This. index = 0; } Public voidAddFirst (doublelist node) {Node.next=Head.next; Node.next.prev=node; Node.prev=Head; Head.next=node; } Public voidRemove (doublelist node) {Node.prev.next=Node.next; Node.next.prev=Node.prev; } Public intGetintkey) { if(Map.containskey (key)) {doublelist node=Map.get (key); Remove (node); AddFirst (node); returnNode.val; } return-1; } Public voidSetintKeyintvalue) { if(Map.containskey (key)) {Map.get (key). Val=value; Doublelist node=Map.get (key); Remove (node); AddFirst (node); return; } Else{doublelist node=Newdoublelist (key, value); Map.put (key, node); if(Index <capacity) {Index++; AddFirst (node); } Else{map.remove (Tail.prev.key); Remove (Tail.prev); AddFirst (node); } } } }
146. LRU Cache