题解 | #设计LFU缓存结构#

设计LFU缓存结构

https://www.nowcoder.com/practice/93aacb4a887b46d897b00823f30bfea1


#include <unordered_map>
struct node{
    struct node* next;
    struct node* prio;
    int key;
    int val;
    int rate;
    node(int _key,int _val,int _rate):next(nullptr),prio(nullptr),key(_key),val(_val),rate(_rate){}
};

struct LinkList{
    struct node* front;
    struct node* rear;
    int size;
    LinkList(){
        front=new node(0,0,0);
        rear=new node(0,0,0);
        front->next=rear;
        rear->prio=front;
        size=0;
    }
};



class Solution{
private:
    /*哈希表+双向链表
    //哈希表1存储key-Node对应关系
    //哈希表2存储的是频率-双向链表
    //每次set,先看是否有该key,无,则直接创建节点并插入到哈希表二对应频率的头部,有则执行更新(修改节点value),
        然后频率+1,添加到对应频率的双向链表头部
    //每次get,修改频率,添加到对应频率的双向链表头部,以上操作都为O(1)时间复杂度
    */
    int rate,k;
    unordered_map<int,node*> hmap_1;
    unordered_map<int, LinkList*> hmap_2;
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * lfu design
     * @param operators int整型vector<vector<>> ops
     * @param k int整型 the k
     * @return int整型vector
     */
    vector<int> LFU(vector<vector<int> >& operators, int _k) {
        // write code here
        rate=0,k=_k;
        vector<int> ans;
        for(auto&v:operators){
            if(v[0]==1){
                set(v[1],v[2]);
            }
            else{
                int value=get(v[1]);
                ans.emplace_back(value);
            }
        }
        return ans;
    }

    void adjust(int key,int value){
        node* _node=hmap_1[key];
        _node->val=value;
        //更新rate
        if(hmap_2[_node->rate]->size==1&&_node->rate==rate){
            rate=_node->rate+1;
        }
        //从hmap_2对应频率的链表中移除_node
        --hmap_2[_node->rate]->size;
        _node->prio->next=_node->next;
        _node->next->prio=_node->prio;
        ++_node->rate;
        int _rate=_node->rate;
        if(hmap_2.count(_rate)==0){
            LinkList* l=new LinkList();
            hmap_2[_rate]=l;
        }
        hmap_2[_rate]->front->next->prio=_node;
        _node->next=hmap_2[_rate]->front->next;
        _node->prio=hmap_2[_rate]->front;
        hmap_2[_rate]->front->next=_node;
        ++hmap_2[_rate]->size;
    }
    int get(int key){
        if(hmap_1.count(key)==0) return -1;
        adjust(key,hmap_1[key]->val);
        return hmap_1[key]->val;
    }

    void set(int key,int value){
        //没有该关键字
        if(hmap_1.count(key)==0){
            //存储已满
            if(hmap_1.size()==k&&hmap_2[rate]->size>0){
                //删除频率为rate的尾节点
                struct node* del=hmap_2[rate]->rear->prio;
                hmap_2[rate]->rear->prio=del->prio;
                del->prio=nullptr;
                del->next=nullptr;
                hmap_1.erase(del->key);
                delete del;
                hmap_2[rate]->size--;
            }
            //插入
            struct node* _node = new node(key,value,1);
            hmap_1[key]=_node;
            if(hmap_2.count(1)==0) {
                LinkList* l=new LinkList();
                hmap_2[1]=l;
            }
            hmap_2[1]->front->next->prio=_node;
            _node->next=hmap_2[1]->front->next;
            _node->prio=hmap_2[1]->front;
            hmap_2[1]->front->next=_node;
            ++hmap_2[1]->size;
            rate=1;
        }
        else{
            adjust(key,value);
        }
    }
};

全部评论

相关推荐

下个早班:秒挂就是不缺人
点赞 评论 收藏
分享
就前几天旅游的时候,打开抖音就经常刷到这类视频:以前是高学历学生、老师、主持人,现在做着团播、擦边主播的工作,以及那些经过精心包装的“职业转型”故事——从铺天盖地的VLOG到所谓的“04年夜场工作日记”,这些内容在初中升学、高考放榜等关键时间节点持续发酵。可以说非常直接且精准地在潜移默化地影响着心智尚未成熟的青少年,使其对特殊行业逐渐脱敏。那我就想问了:某些传播公司、平台运营者甚至某些夜场的老板,你们究竟在传递怎样的价值观?点开那些视频,评论区里也是呈现明显的两极分化:一种是​​经济下行论​​:“现在就业市场已经艰难到这种程度了吗?”​​一种是事实反驳派​​:这些创作者往往拥有名校背景,从事着...
牛客刘北:被环境教育的,为了能拿到足够的钱养活自己,不甘心也得甘心,现在的短视频传播的思想的确很扭曲,但是很明显,互联网玩上一年你就能全款提A6,但你全心全意不吃不喝工作一年未必能提A6,但是在高考中考出现这个的确很扭曲,在向大家传播“不上学,玩互联网也可以轻松年入百万”,不是人变了,是社会在变
预测一下26届秋招形势
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务