目录
题目链接
题目

解题思路
哈希+双向链表:哈希能够实现时间查询和增加的时间复杂度为o(1),双向链表能否实现删除最久不使用其超过长度的
代码
java
class LRUCache {
class DecLinkedList{
int key;
int val;
DecLinkedList next;
DecLinkedList pre;
DecLinkedList(){}
DecLinkedList(int _key,int _val){key=_key;val=_val;}
}
HashMap<Integer,DecLinkedList> map=new HashMap<>();
int size;
int capacity;
DecLinkedList head;
DecLinkedList tail;
public LRUCache(int capacity) {
this.capacity=capacity;
size=0;
head=new DecLinkedList();
tail=new DecLinkedList();
head.next=tail;
tail.pre=head;
}
public void deleteNode(DecLinkedList node){
node.next.pre=node.pre;
node.pre.next=node.next;
}
public void moveToHead(DecLinkedList node){
node.next=head.next;
node.pre=head;
head.next.pre=node;
head.next=node;
}
public void addTohead(DecLinkedList node){
deleteNode(node);
moveToHead(node);
}
public int get(int key) {
DecLinkedList node=map.get(key);
if(node!=null){
addTohead(node);
return node.val;
}
return -1;
}
public DecLinkedList deleteAll(){
DecLinkedList node=tail.pre;
deleteNode(node);
return node;
}
public void put(int key, int value) {
DecLinkedList node=map.get(key);
if(node==null){
size++;
node=new DecLinkedList(key,value);
if(size>capacity){
DecLinkedList cur= deleteAll();
map.remove(cur.key);
size--;
}
moveToHead(node);
}else{
node.val=value;
addTohead(node);
}
map.put(key,node);
}
}
/**
* Your LRUCache object will be instantiated and called as such:
* LRUCache obj = new LRUCache(capacity);
* int param_1 = obj.get(key);
* obj.put(key,value);
*/