public classLFUCache {private Node head = null;private int cap = 0;private HashMap valueHash = null;private HashMap nodeHash = null;public LFUCache(intcapacity) {this.cap =capacity;
valueHash= new HashMap();
nodeHash= new HashMap();
}public int get(intkey) {if(valueHash.containsKey(key)) {
increaseCount(key);returnvalueHash.get(key);
}return -1;
}public void set(int key, intvalue) {if ( cap == 0 ) return;if(valueHash.containsKey(key)) {
valueHash.put(key, value);
Node node=nodeHash.get(key);
node.keys.remove(key);
node.keys.add(key);
}else{if (valueHash.size()
valueHash.put(key, value);
}else{
removeOld();
valueHash.put(key, value);
}
addToHead(key);
}
increaseCount(key);
}private void addToHead(intkey) {if (head == null) {
head= new Node(0);
head.keys.add(key);
}else if (head.count > 0) {
Node node= new Node(0);
node.keys.add(key);
node.next=head;
head.prev=node;
head=node;
}else{
head.keys.add(key);
}
nodeHash.put(key, head);
}private void increaseCount(intkey) {
Node node=nodeHash.get(key);
node.keys.remove(key);if (node.next == null) {
node.next= new Node(node.count+1);
node.next.prev=node;
node.next.keys.add(key);
}else if (node.next.count == node.count+1) {
node.next.keys.add(key);
}else{
Node tmp= new Node(node.count+1);
tmp.keys.add(key);
tmp.prev=node;
tmp.next=node.next;
node.next.prev=tmp;
node.next=tmp;
}
nodeHash.put(key, node.next);if (node.keys.size() == 0) remove(node);
}private voidremoveOld() {if (head == null) return;int old = 0;for (intn: head.keys) {
old=n;break;
}
head.keys.remove(old);if (head.keys.size() == 0) remove(head);
nodeHash.remove(old);
valueHash.remove(old);
}private voidremove(Node node) {if (node.prev == null) {
head=node.next;
}else{
node.prev.next=node.next;
}if (node.next != null) {
node.next.prev=node.prev;
}
}classNode {public int count = 0;public LinkedHashSet keys = null;public Node prev = null, next = null;public Node(intcount) {this.count =count;
keys= new LinkedHashSet();
prev= next = null;
}
}
}/*** Your LFUCache object will be instantiated and called as such:
* LFUCache obj = new LFUCache(capacity);
* int param_1 = obj.get(key);
* obj.set(key,value);*/