做网站免费吗,建设银行网站名称怎么写,企业品牌网站建设注意事项,我做外贸要开国际网站吗题目#xff1a;
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类#xff1a;
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中#xff0c;则返回关键字的值
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中则返回关键字的值否则返回 -1 。void put(int key, int value) 如果关键字 key 已经存在则变更其数据值 value 如果不存在则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity 则应该 逐出 最久未使用的关键字。
函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。
方法灵神 图书类比头插 哈希表 代码
class LRUCache {private static class Node {int key, value;Node prev, next;Node(int k, int v) {key k;value v;}}private final int capacity;private final Node dummy new Node(0, 0); // 哨兵节点 private final MapInteger, Node keyToNode new HashMap();public LRUCache(int capacity) {this.capacity capacity;dummy.prev dummy;dummy.next dummy;}public int get(int key) {Node node getNode(key);return node ! null ? node.value : -1;}public void put(int key, int value) {Node node getNode(key);if (node ! null) {node.value value;return;}node new Node(key, value); // 新书keyToNode.put(key, node);pushFront(node); // 放最上面if (keyToNode.size() capacity) { // 书太多了Node backNode dummy.prev;keyToNode.remove(backNode.key);remove(backNode); // 去掉最后一本书}}private Node getNode(int key) {if (!keyToNode.containsKey(key)) { // 没有这本书return null;}Node node keyToNode.get(key); // 有这本书remove(node); // 把这本书抽出来pushFront(node);return node;}// 删除一个节点抽出一本书private void remove(Node x) {x.prev.next x.next;x.next.prev x.prev;}// 在链表头添加一个节点把一本书放在最上面private void pushFront(Node x) {x.prev dummy;x.next dummy.next;x.prev.next x;x.next.prev x;}
}