Created
November 17, 2013 04:02
-
-
Save junjiah/7508981 to your computer and use it in GitHub Desktop.
solved 'LRU cache' on LeetCode http://oj.leetcode.com/problems/lru-cache/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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