JAVA算法练习题day27

35.LRU缓存

cpp 复制代码
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 Map<Integer,Node> key2Node = new HashMap<>();
    public LRUCache(int capacity) {
        this.capacity = capacity;
        //这里还要对dummy进行前后指针的初始化
        dummy.next = dummy;
        dummy.prev = dummy;
    }
    
    //需要返回关键字的值
    public int get(int key) {
        //查询该关键字是否存在对应节点,若存在,将该节点删除而后将该节点放到链表开头,返回关键字的值(也就是节点的值);若不存在则返回-1
        //优化一下,既然get和put都需要去先删除再置顶:写函数getnode,该函数先将节点删除,而后将其置顶
        //再写一个删除节点的函数就好
        Node key2node = getNode(key);
        if(key2node==null) return -1;
        else return key2node.value;
    }
    
    public void put(int key, int value) {
        Node key2node = getNode(key);
        //修改key对应的值为value
        if(key2node!=null){
            key2node.value = value;
        }
        else{
            if(key2Node.size() >= capacity){
                //双向有环链表,找头部就是dummy.next;找尾部就是dummy.prev
                Node lastNode = dummy.prev;
                remove(lastNode);
                //哈希表删除一个
                key2Node.remove(lastNode.key);
                //把新节点放到头部
                Node putnewNode = new Node(key,value);
                push2head(putnewNode);
                //哈希表插入一个
                key2Node.put(key,putnewNode);
            }
            else{
                Node node = new Node(key,value);
                push2head(node);
                key2Node.put(key,node);
            }
        }
    }
    //getNode()
    private Node getNode(int key){
        if(key2Node.containsKey(key)){
            Node node = key2Node.get(key);
            remove(node);
            push2head(node);
            return node;
        }
        else return null;
    }
    //remove()
    private void remove(Node node){
        node.next.prev = node.prev;
        node.prev.next = node.next;
    }
    //push2head
    private void push2head(Node x){
        x.next = dummy.next;
        x.prev=dummy;
        dummy.next.prev=x;
        dummy.next=x;
        //x.prev=dummy;
        //x.next=dummy.next;
        //x.prev.next=x;
        //x.next.prev=x;
    }
}

/**
 * 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);
 */
相关推荐
秋月的私语2 分钟前
遥感影像拼接线优化工具:基于Qt+GDAL+OpenCV的从零到一实践
开发语言·qt·opencv
steins_甲乙4 分钟前
从0做一个小型内存泄露检测器(2): elf文件的动态链接
c++
甄心爱学习10 分钟前
【最优化】1-6章习题
人工智能·算法
xwz小王子10 分钟前
智元发布 GO-2:动作空间推理 + 全生命周期闭环,让机器人稳定可靠落地
开发语言·golang·机器人
charlie11451419110 分钟前
通用GUI编程技术——图形渲染实战(二十八)——图像格式与编解码:PNG/JPEG全掌握
开发语言·c++·windows·学习·图形渲染·win32
PD我是你的真爱粉10 分钟前
向量数据库原理与检索算法入门:ANN、HNSW、LSH、PQ 与相似度计算
数据库·人工智能·算法
汀、人工智能13 分钟前
[特殊字符] 第72课:杨辉三角
数据结构·算法·数据库架构·图论·bfs·杨辉三角
ZC跨境爬虫13 分钟前
海南大学交友平台登录页开发实战day4(解决python传输并读取登录信息的问题)
开发语言·前端·python·flask·html
wjs202416 分钟前
SQL LEN() 函数详解
开发语言
姓刘的哦21 分钟前
Qt自定义控件
开发语言·qt