一、题目
二、思路
- 题目要求 O(1) 的平均时间复杂度运行 -> 使用Map空间换时间 Map<Integer, Node>
- Map 通过 key 直接找到对应节点 getNode(key) -> Node
- 记得只要查过该节点之后就应该把该节点放到最前面 pushFront(Node)
- put 元素后,在map中添加,记得检查是否超过 capacity,超过则删除在map中的元素,以及在链表中的元素 delete(Node)
- 这里提到的 pushFront(Node) 和 delete(Node) 都是针对双向队列进行位置移动相关的操作,不涉及 Map。
三、代码
class LRUCache {
class Node{
int key,val;
Node pre, next;
Node(int key, int val) {
this.key = key;
this.val = val;
}
}
Node dummy = new Node(0, 0);
int capacity;
Map<Integer, Node> map = new HashMap<>();
public LRUCache(int capacity) {
dummy.pre = dummy;
dummy.next = dummy;
this.capacity = capacity;
}
public int get(int key) {
Node node = map.get(key);
if (node == null) {
return -1;
}
delete(node);
pushFront(node);
return node.val;
}
public void put(int key, int value) {
Node node = map.get(key);
if (node != null) {
node.val = value;
delete(node);
pushFront(node);
return ;
}
node = new Node(key,value);
pushFront(node);
map.put(key, node);
if (map.size() > capacity) {
Node lastNode = dummy.pre;
delete(lastNode);
map.remove(lastNode.key);
}
}
private void pushFront(Node node) {
node.next = dummy.next;
node.pre = dummy;
dummy.next.pre = node;
dummy.next = node;
}
private void delete(Node node) {
node.pre.next = node.next;
node.next.pre = node.pre;
}
}