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

LeetCode-146. LRU 缓存

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

LeetCode-146. LRU 缓存

LeetCode-146. LRU 缓存

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

struct DlinkedNode{
    int key,val;
    DlinkedNode *prev;
    DlinkedNode *next;
    DlinkedNode() : key(0),val(0),prev(nullptr),next(nullptr){}
    DlinkedNode(int key,int value) : key(key),val(value),prev(nullptr),next(nullptr){}
};

class LRUCache {
public:
    LRUCache(int capacity) {
        size = 0;
        this->capacity = capacity;
        head = new DlinkedNode;
        tail = new DlinkedNode;
        head->next = tail;
        tail->prev = head;
    }
    
    int get(int key) {
        if(keyToNode.count(key)){
            DlinkedNode *node = keyToNode[key];
            moveToHead(node);
            return node->val;
            
        }
        else{
            return -1;
        }
    }
    
    void put(int key, int value) {
        if(keyToNode.count(key)){//存在
            DlinkedNode *node = keyToNode[key];
            node->val = value;
            moveToHead(node);
        }
        else{//不存在
            DlinkedNode *node = new DlinkedNode(key,value);
            addToHead(node);
            keyToNode[key] = node;
            size++;
            if(size>capacity){
                DlinkedNode* node = moveTail();
                keyToNode.erase(node->key);
                delete node;
                node = nullptr;
                size--;
            }
        }
    }
    void addToHead(DlinkedNode *node){
        node->prev = head;
        node->next = head->next;
        head->next->prev = node;
        head->next = node;
    }
    void moveToNode(DlinkedNode *node){
        node->prev->next = node->next;
        node->next->prev = node->prev;
    }
    void moveToHead(DlinkedNode *node){
        moveToNode(node);
        addToHead(node);
    }
    DlinkedNode* moveTail(){
        DlinkedNode* node = tail->prev;
        moveToNode(node);
        return node;
    }
private:
    unordered_map keyToNode;
    int size;
    int capacity;
    DlinkedNode *head;
    DlinkedNode *tail;
};

    
    

    

    



执行结果:
通过

执行用时:
356 ms, 在所有 C++ 提交中击败了91.72%的用户
内存消耗:
161.1 MB, 在所有 C++ 提交中击败了68.42%的用户
通过测试用例:
22 / 22

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

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

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