• leetcode LRU Cache


     题目链接。实现一个数据结构用于LRU,最近最少使用,O(1)插入和删除。关于LRU的基本知识可参考here

    先推荐JustDoIT的。

    下面是我自己实现的。

    class LRUCache{
    public:
    //146LRU Least Recently Used
        int LRUsize;
        struct LRUNode
        {
            int key;
            int value;
            LRUNode *pre, *next;
            LRUNode(int x, int y): key(x), value(y), pre(NULL), next(NULL){}
        };
        unordered_map<int, LRUNode *> LRUmap;
        LRUNode *head = NULL, *tail = NULL;
        
        LRUCache(int capacity)
        {
            LRUsize = capacity;
        }
    
        int get(int key)
        {
            if (LRUmap.count(key)) // if exists
            {
                if (head != LRUmap[key] && tail != LRUmap[key]) // 节点在中间
                {
                    LRUmap[key] -> pre -> next = LRUmap[key] -> next;
                    LRUmap[key] -> next -> pre = LRUmap[key] -> pre;
                    LRUmap[key] -> next = head;
                    head -> pre = LRUmap[key];
                    head = LRUmap[key];
                    head -> pre = NULL;
                }
                else if (head != LRUmap[key] && tail == LRUmap[key]) // 节点最后一个则放在头部即可
                {
                    tail = LRUmap[key] -> pre;
                    tail -> next = NULL;
                    LRUmap[key] -> pre = NULL;
                    head -> pre = LRUmap[key];
                    LRUmap[key] -> next = head;
                    head = LRUmap[key];
                }
                return LRUmap[key] -> value;
            }
            else
                return -1;
        }
    
        void set(int key, int value)
        {
            if (LRUmap.count(key))
            {
                LRUmap[key] -> value = value; // 一定要更新value
                if (head != LRUmap[key] && tail != LRUmap[key]) // 节点在中间
                {
                    LRUmap[key] -> pre -> next = LRUmap[key] -> next;
                    LRUmap[key] -> next -> pre = LRUmap[key] -> pre;
                    LRUmap[key] -> next = head;
                    head -> pre = LRUmap[key];
                    head = LRUmap[key];
                    head -> pre = NULL;
                }
                else if (head != LRUmap[key] && tail == LRUmap[key]) // 节点最后一个则放在头部即可
                {
                    tail = tail -> pre;
                    tail -> next = NULL;
                    LRUmap[key] -> pre = NULL;
                    head -> pre = LRUmap[key];
                    LRUmap[key] -> next = head;
                    head = LRUmap[key];
                }
            }
            else
            {
                LRUNode *tmp = new LRUNode(key, value);
                if (head == tail && head == NULL)
                {
                    head = tmp;
                    tail = tmp;
                    LRUmap[key] = head;
    
                }
                else if (LRUsize == LRUmap.size()) //注意可能容量只为1,满了记得删除
                {
                    tmp -> next = head;
                    head -> pre = tmp;
                    head = tmp;
                    LRUmap[key] = tmp;
                    LRUmap.erase(tail -> key);
                    tail = tail -> pre;
                    tail -> next = NULL;
     
                }
                else
                {
                    tmp -> next = head;
                    head -> pre = tmp;
                    head = tmp;
                    LRUmap[key] = tmp;
                }
            }
        }
    };
    View Code

    虽然AC了,不过我还在纠结不知道如何delete代码中new出来的内存。如果用java的话就不用delete了。但是看所有的leetcode提交的分布,c++普遍是速度最快的。

    貌似给出推荐的JustDOIT的也是没有delete的。

    然后我就找啊找。

    这一篇写的还不错。里面有原理解释,而且delete在析构中进行。用可用节点的数组存。或者是用原有的已经有的尾部来存新进入的点。这个想法不错。

    这题还是考察挺多的。出现频率高,有时间还是要好好消化。

  • 相关阅读:
    去除空格
    常见的Js
    无法访问 ASP 兼容性模式
    asp.net mvc 笔记一
    PowerDesigner如何将设计的表更新到数据库中
    微信小程序基于第三方websocket的服务器端部署
    C# Linq GroupBy 分组过滤求和
    一步一步教你用c# entity framework6 连接 sqlite 实现增删改查
    执行指定iframe页面的脚本
    vs2017 x64 ibatis.net 平台调用 Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342 x64
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4163992.html
Copyright © 2020-2023  润新知