Leetcode-146.LRU缓存

bash 复制代码
请你设计并实现一个满足 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) 的平均时间复杂度运行。

示例:

输入
["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -1, 3, 4]

解释
LRUCache lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1);    // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
lRUCache.get(2);    // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}
lRUCache.get(1);    // 返回 -1 (未找到)
lRUCache.get(3);    // 返回 3
lRUCache.get(4);    // 返回 4
提示:

1 <= capacity <= 3000
0 <= key <= 10000
0 <= value <= 10^5
最多调用 2 * 10^5 次 get 和 put

页面置换算法 算法复习

链接: 【操作系统】页面置换算法总结

AC 代码

java 复制代码
class LRUCache {
    private int size;
    private Node dummy = new Node(0,0);
    private Map<Integer,Node> map = new HashMap<>();
    public LRUCache(int capacity) {
        this.size = capacity;
        dummy.prev = dummy;
        dummy.next = dummy;
    }
    
    public int get(int key) {
        if(map.containsKey(key)) {
            Node n = map.get(key);
            // 放到最上面
            Node newNode = new Node(n.key, n.value);
            putFront(newNode);
            // 删除原来的
            remove(n);
            map.put(key,newNode);
            return n.value;
        }
        return -1;
    }
    
    public void put(int key, int value) {
        // 是否存在
        if(map.containsKey(key)) {
            Node n = map.get(key);
            n.value = value;
            remove(n);
            Node newNode = new Node(key, value);
            putFront(newNode);
            map.put(key,newNode);
        }
        else {
            Node n = new Node(key,value);
            map.put(key,n);
            putFront(n);
            if(map.size() > size) {
                map.remove(dummy.prev.key);
                remove(dummy.prev);
            }
        }
    }


    private void putFront(Node front) {
        front.next = dummy.next;
        front.prev = dummy;
        dummy.next = front;
        front.next.prev = front;
    }

    private void remove(Node node) {
        node.prev.next = node.next;
        node.next.prev = node.prev;
    }
    private static class Node {
        Integer key;
        Integer value;
        Node next;
        Node prev;
        public Node(Integer key, Integer value) {
            this.key = key;
            this.value = value;
        }
    }
}
相关推荐
启山智软8 分钟前
【中大企业选择源码部署商城系统】
java·spring·商城开发
我真的是大笨蛋10 分钟前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
老鼠只爱大米16 分钟前
LeetCode经典算法面试题 #108:将有序数组转换为二叉搜索树(递归分治、迭代法等多种实现方案详解)
算法·leetcode·二叉树·二叉搜索树·平衡树·分治法
踩坑记录26 分钟前
leetcode hot100 104. 二叉树的最大深度 easy 递归dfs 层序遍历bfs
leetcode·深度优先·宽度优先
怪兽源码38 分钟前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
恒悦sunsite44 分钟前
Redis之配置只读账号
java·redis·bootstrap
梦里小白龙1 小时前
java 通过Minio上传文件
java·开发语言
人道领域1 小时前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql
sheji52611 小时前
JSP基于信息安全的读书网站79f9s--程序+源码+数据库+调试部署+开发环境
java·开发语言·数据库·算法
毕设源码-邱学长1 小时前
【开题答辩全过程】以 基于Java Web的电子商务网站的用户行为分析与个性化推荐系统为例,包含答辩的问题和答案
java·开发语言