Skip to content

Instantly share code, notes, and snippets.

@junjiah
Created November 17, 2013 04:02
Show Gist options
  • Save junjiah/7508981 to your computer and use it in GitHub Desktop.
Save junjiah/7508981 to your computer and use it in GitHub Desktop.
solved 'LRU cache' on LeetCode http://oj.leetcode.com/problems/lru-cache/
import java.util.HashMap;
import java.util.Map;
/**
* Created with IntelliJ IDEA.
* User: EDFward
* Date: 11/17/13
* Time: 12:52 AM
* Happy coding!
*/
class DLinkedItem {
public DLinkedItem(int val, int k) {
this.val = val;
this.k = k;
}
public int getK() { return k; }
public DLinkedItem prev;
public DLinkedItem next;
public int val;
private int k;
}
class DLinkedList {
public DLinkedItem front, end;
public DLinkedList() {
front = new DLinkedItem(-9999, -9999);
end = new DLinkedItem(-9999, -9999);
end.next = front;
front.prev = end;
}
public void moveToFront(DLinkedItem d) {
d.prev.next = d.next;
d.next.prev = d.prev;
front.prev.next = d;
d.prev = front.prev;
front.prev = d;
d.next = front;
}
public void addToFront(DLinkedItem d) {
front.prev.next = d;
d.prev = front.prev;
front.prev = d;
d.next = front;
}
public int removeLeast() {
DLinkedItem least = end.next;
int res = least.getK();
end.next = least.next;
// least.next.prev = front; // f**k my bug!
least.next.prev = end;
return res;
}
public void printList(Boolean reverse) { // for debug
if (!reverse) {
DLinkedItem d = end.next;
while (d != front) {
System.out.print(d.getK()+" ");
d = d.next;
}
}
else {
DLinkedItem d = front.prev;
while (d != end) {
System.out.print(d.getK()+" ");
d = d.prev;
}
}
}
}
public class LRUCache {
public static void main(String[] args) {
LRUCache lru = new LRUCache(3);
lru.set(1,1);lru.set(2,2);lru.set(3,3);lru.set(4,4); lru.get(4);lru.get(3);lru.get(2);lru.get(1);lru.set(5,5);lru.get(1);
lru.dLinkedList.printList(false);
System.out.print(" | ");
lru.dLinkedList.printList(true);
}
public LRUCache(int capacity) {
dLinkedList = new DLinkedList();
dataMap = new HashMap<Integer, DLinkedItem>(capacity);
this.capacity = capacity;
}
public int get(int key) {
if (dataMap.containsKey(key)) {
DLinkedItem d = dataMap.get(key);
dLinkedList.moveToFront(d);
return d.val;
}
else {
return -1;
}
}
public void set(int key, int value) {
if (dataMap.containsKey(key)) {
DLinkedItem d = dataMap.get(key);
d.val = value;
dLinkedList.moveToFront(d);
}
else {
if (dataMap.size() < capacity) { // addToFront
DLinkedItem d = new DLinkedItem(value, key);
dataMap.put(key, d);
dLinkedList.addToFront(d);
}
else { //
DLinkedItem d = new DLinkedItem(value, key);
int rmKey = dLinkedList.removeLeast();
dataMap.remove(rmKey);
dataMap.put(key, d);
dLinkedList.addToFront(d);
}
}
}
private Map<Integer, DLinkedItem> dataMap;
private int capacity;
private DLinkedList dLinkedList;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment