题目
更快的代码(自己定义一个双端结点Node,形成一个LRU式的链表(有两个伪头head和伪尾结点tail),还用到了map(注意: map中存的是 key 和 Node)
class LRUCache {
int size = 0;
int capacity;
class Node{
Node pre;
Node next;
int key;
int value;
Node(){
}
Node(int key,int value){
this.key = key;
this.value = value;
}
}
Map<Integer,Node> map = new HashMap<>();
Node head;
Node tail;
public LRUCache(int capacity) {
this.capacity = capacity;
head = new Node();
tail = new Node();
head.next = tail;
head.pre = null;
tail.pre = head;
tail.next = null;
}
public int get(int key) {
Node tNode = map.get(key);
if(tNode == null) return -1;
removeToHead(tNode);
return tNode.value;
}
private void removeToHead(Node tNode){
removeNode(tNode);
addToHead(tNode);
}
private void removeNode(Node tNode){
tNode.next.pre = tNode.pre;
tNode.pre.next= tNode.next;
}
private void addToHead(Node tNode){
tNode.next = head.next;
head.next.pre = tNode;
head.next = tNode;
tNode.pre = head;
}
public void put(int key, int value) {
Node tNode = map.get(key);
if(tNode == null){
size++;
Node newNode = new Node(key,value);
map.put(key,newNode);
if(size > capacity){
removeTail();
addToHead(newNode);
}else{
addToHead(newNode);
}
}else{
tNode.value = value;
removeToHead(tNode);
}
}
private void removeTail(){
map.remove( tail.pre.key );
size--;
tail.pre = tail.pre.pre;
tail.pre.next = tail;
}
}
我的代码(利用ArrayDeque实现的queue,不会超时)
class LRUCache {
int capacity;
Map<Integer, Integer> map;
Queue<Integer> queue;
public LRUCache(int capacity) {
this.capacity = capacity;
this.map = new HashMap<>();
this.queue = new ArrayDeque<>();
}
public int get(int key) {
if ( map.containsKey(key) ) {
queue.remove(Integer.valueOf(key));
queue.add(key);
return map.get(key);
} else {
return -1;
}
}
public void put(int key, int value) {
if ( map.containsKey(key) ) {
queue.remove(Integer.valueOf(key));
} else {
if ( this.capacity == map.size() ) {
int cur = queue.remove();
map.remove(cur);
}
}
map.put(key, value);
queue.add(key);
}
}
做第四遍,发现自己一些易错的地方,已经在注释中表明
class LRUCache {
Queue<Integer> q;
Map<Integer,Integer> map;
int capacity;
public LRUCache(int capacity) {
map = new HashMap<>();
q = new ArrayDeque<>();
this.capacity = capacity;
}
public int get(int key) {
if(map.containsKey(key)){
q.remove(key);
q.add(key);
return map.get(key);
}
return -1;
}
public void put(int key, int value) {
if(!map.containsKey(key)){
map.put(key,value);
if(q.size()<capacity){
q.add(key);
return;
}
int remove = q.remove();
map.remove(remove);
q.add(key);
return;
}
q.remove(key);
q.add(key);
map.put(key,value);
return;
}
}