146.LRU缓存

146. LRU 缓存

使用哈希表和双向链表解决(也可以LinkedHashMap)

用于操作链表的方法为removeNode, addToHead.

在put中:

如果不存在key,则为添加, ++size, 需要判断容量;

容量超过,则尾删, --size;

容量没超过, 则不删;

如果存在key, 则为修改, 不需要判断容量;

以上两步均为操作,因此都得addToHead.

java 复制代码
class Node{
    public int key, val;
    public Node prev;
    public Node next;
    public Node(int a, int b){
        this.key = a;
        this.val = b;
        this.prev = null;
        this.next = null;
    }
    public Node(){
        this.key = 0;
        this.val = 0;
        this.prev = null;
        this.next = null;
    }
}
class LRUCache {
    private Node head;
    private Node tail;
    private Map<Integer, Node>map = new HashMap<>();
    private int capacity;
    private int size;
    public LRUCache(int capacity) {
        this.size = 0;
        this.capacity = capacity;
        head = new Node();
        tail = new Node();
        head.next = tail;
        tail.prev = head;
    }
    
    public int get(int key) {
        if(!map.containsKey(key)){
            return -1;
        }
        Node temp = map.get(key);
        removeNode(temp);
        addToHead(temp);
        return temp.val;
    }
    
    public void put(int key, int value) {
        Node node = map.get(key);
        if(node == null){
            Node newNode = new Node(key, value);
            map.put(key, newNode);
            addToHead(newNode);
            ++size;
            if(size > capacity){
                Node tail1 = tail.prev;
                map.remove(tail1.key);
                removeNode(tail1);
                --size;
            }
        }else {
            node.val = value;
            removeNode(node);
            addToHead(node);
        }
    }

    public void removeNode(Node node){
        node.next.prev = node.prev;
        node.prev.next = node.next;
    }

    public void addToHead(Node node){
        node.next = head.next;
        node.prev = head;
        head.next = node;
        node.next.prev = node;
    }
}

先前我在实现put操作时使用了containsKey,这使得我原来的代码时间消耗很高

相关推荐
就叫_这个吧4 小时前
Java递归方法实现面包屑导航
java·开发语言
fīɡЙtīиɡ ℡4 小时前
AI 应用系统设计
java·开发语言·人工智能
小飞学编程...4 小时前
【哈希表】
数据结构·哈希算法·散列表
城管不管5 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
码匠许师傅5 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
AI绘画哇哒哒5 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
最强小杰5 小时前
gpt-5.6-sol 频繁报 503 怎么办?区分容量熔断和限速 429 的排查方法 + 可复用 retry wrapper
java·人工智能·gpt·ai
CDN3607 小时前
CDN 缓存策略优化实操:出海业务提升缓存命中率,TTL、缓存 Key、刷新配置与踩坑总结
缓存·cdn加速·cdn防护·360cdn
重生之后端学习7 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
吠品7 小时前
Wine 在 Linux 上运行 Windows 软件完整指南
java·linux·服务器