一、题目
二、思路
- 题目要求 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;}
}