栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

146. LRU 缓存(Java) Leecode

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

146. LRU 缓存(Java) Leecode

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

要利用哈希链表。

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

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

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

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

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

class LRUCache {

    int capacity;
    linkedHashMap 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);
    }
}

如果对你有帮助,可以关注下公众号。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/771047.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号