146. LRU 缓存(Java) Leecode

在这里插入图片描述

解题思路:
这道题主要考察缓存机制。

要利用哈希链表。

靠近头部的数据是最久未使用的,靠近尾部的数据是最近使用的。

双链表一层存Key,与哈希表的Key做映射,另一层存Value。

双链表与哈希表都存Key的原因是,在双链表中要做删除操作,要操作删除节点的前驱指针,只有双链表也存key,才能保证时间复杂度为O(1)。

双链表中同时存Key 和 Value的意义是,当缓存容量满的时候,我们要删除双链表中最久未使用的Node, 此时也要把Map中映射到的Key也删除掉,这时只能通过Key的辅助来达到目的。

想一下,普通链表的删除,不能像数组一样通过索引的方式删除。

class LRUCache {

    int capacity;
    LinkedHashMap<Integer, Integer> cache = new LinkedHashMap<>();
    
	//设定缓存容量
    public LRUCache(int capacity) {
        this.capacity = capacity;
    }
    
    //获取对应Key的值,并把其调整为最近使用
    public int get(int key) {
        if(!cache.containsKey(key)){
            return -1;
        }
        makeRecently(key);
        return cache.get(key);
        
    }
    
    //加入新的值
    public void put(int key, int value) {

        if(cache.containsKey(key)){
            cache.put(key,value); //修改key的值
            makeRecently(key); //将k变为最近使用
            return;
        }
        if(cache.size() == this.capacity){
            //链表表头是最久未使用的key
            int oldKey = cache.keySet().iterator().next(); //双链表的keySet,获取表头,这里KeySet是有序的
            cache.remove(oldKey);
        }
        cache.put(key,value);
        
    }
    
	//把一个key 变为最近使用的缓存
    private void makeRecently(int key){
        int val = cache.get(key); 
        cache.remove(key);
        cache.put(key,val);
    }
}

如果对你有帮助,可以关注下公众号。
请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Not_Today.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值